約 2,941,411 件
https://w.atwiki.jp/yaruoperformer/pages/702.html
j{ヽ / v /}j{ .} __ j{ Vヘ ,.i i / .ji i i i i i i i i i}!. Vi\ /i i/ /i i i i i i i i i ∧ Vi i \ /i i i / /i i i ア´ ̄~^'' v. 寸i i i\ /i i i / /i i i i/ \. 寸i i i;\ /i i i / /i i i i/ ム、. 寸i i ム /i i i / /i i i i i j{ i 寸h、 寸i i } vi i/ /i i i i i i i/j{. ト. Vi i\. 寸! 寸 ./i i i i i i i/ { ./ \. Vi i i iト、 }|. У!i i i ivi ∠__v |__\. Ⅶi ij \ /. .{i i i i iY ___ v | ___Υj i i |. . . . .v / . . . Yi i i i |汽 〒 \ 〒 ア|i i i イ.. . . . ..} {. . . . ..トi i i∧. ^ ̄ ̄ \ \  ̄^ |i i i ij. . . . . .} v . . Vi i寸ヘ、 ; `¨¨⌒ヽ /i i i リ . . . . / _ \ 寸iム⌒ /i i / / /-=ニニ=- >. 寸心、 _ , /'i/ .<. /-=ニニニニ=-=ニ≧s寸i i >x─--- 、. イ// .<ニニニ=- -=-._ 〈-=ニニニニニ=-=ニ..> -==x \ /' <-=ニ||ニニニニニニニ=-_. V-=-=ニニニニr=≦  ̄ヽ\\_〉イ..=ニニニ||ニニニニニニニニ=-_. V-=ニ=-=ニ/.V ⌒\ヽ\ マ\-=ニ||ニニニニニニニニ=-〉. |-=ニ=-=./-=-.V _ -=ヘ ヽ\`ヽ .≫. -=ニニニニニ=-=ニ=-//. |-=ニ=-./-=ニ=-\_/-=ニニ=-∧ V.` -'.≪-=ニニニニニ=-=ニニ=-/.〈. j{-=ニ=-j{v-=ニニ=-/\-=ニ>''^~.≪ = ≫~^''<-=ニニ=-=ニニニ=-{.=∧. j{-=ニ=-j{ \-=ニ=/-==\ ]}__{[ \-=ニニニニ=-=ニ.{-=-〉 j{-=ニ=-j{ =ニ\-./-=ニ=./ ̄ ニ=-、___r=ニ \ =ニニニニ=-={-=∧ 名前:オーゼン 性別:女 原作:メイドインアビス 一人称: 二人称: 口調: AA:メイドインアビス/オーゼン.mlt 白笛の1人であり、「不動卿」「動かざるオーゼン」の二つ名を持つ探窟隊 「地臥せり」のリーダーの女性。 身長2mを超える大女で見た目以上に歳を重ねている。 怪力おばさんとも。 サディスト的人格破綻者に思えるが実は優しく、 後に出る同じ白笛のこの人と比べると遥かに人格者。 キャラ紹介 やる夫Wik Wikipedia アニヲタWiki ニコ百 ピクペ 登場作品リスト タイトル 原作 役柄 頻度 リンク 備考 俺の魔物討伐学園生活はやはりどこか間違っている オリジナル 学園の教師 準 まとめ 予備 R-18 あんこ完結 彼女は永遠の夜を廻るようです オリジナル 特一級術士。”元”対『異貌』最強 準 まとめ R-18G 完結 モンハン立志伝キル夫 モンスターハンター G級ハンター。『地臥せり』の猟団長古龍観測所の防人 準 まとめ R-18G 安価あんこ サムライ☆べゑすぼおる オリジナル 十鬼衆、卯月の鬼 脇 まとめ R-18G エター ペコリーヌの忠臣狼、冒険者になる オリジナル 冒険者の1人 脇 第0話 安価 やる夫が導かれない者達-SKYRIM The Elder Scrolls V:SKYRIM パーサーナックス役 脇 まとめ 短編 タイトル 原作 役柄 リンク 備考
https://w.atwiki.jp/yamamura2/pages/8977.html
【TOP】【←prev】【Nintendo DS】【next→】 悪魔城ドラキュラ ギャラリー オブ ラビリンス タイトル 悪魔城ドラキュラ ギャラリー オブ ラビリンス 機種 ニンテンドーDS 型番 NTR-P-ACBJ ジャンル アクション 発売元 コナミデジタルエンタテインメント 発売日 2006-11-16 価格 5229円(税込) タイトル 悪魔城ドラキュラ ギャラリー オブ ラビリンス コナミ・ザ・ベスト 機種 ニンテンドーDS 型番 NTR-P-ACBJ ジャンル アクション 発売元 コナミデジタルエンタテインメント 発売日 2009-1-15 価格 2940円(税込) 悪魔城ドラキュラ 関連 Console Game FC 悪魔城伝説 悪魔城すぺしゃる ぼくドラキュラくん 悪魔城ドラキュラ FDS 悪魔城ドラキュラ ドラキュラ II 呪いの封印 SCD-R 悪魔城ドラキュラX 血の輪廻 SFC 悪魔城ドラキュラ 悪魔城ドラキュラXX MD VAMPIRE KILLER PS 悪魔城ドラキュラX 月下の夜想曲 悪魔城年代記 悪魔城ドラキュラ SS 悪魔城ドラキュラX 月下の夜想曲 N64 悪魔城ドラキュラ 黙示録 悪魔城ドラキュラ 黙示録 外伝 PS2 悪魔城ドラキュラ 闇の呪印 Wii 悪魔城ドラキュラ Judgment PS3 悪魔城ドラキュラ Lords of Shadow 2 Handheld Game GB ドラキュラ伝説 ドラキュラ伝説 II 悪魔城すぺしゃる ぼくドラキュラくん 悪魔城ドラキュラ 漆黒たる前奏曲 GBA 悪魔城ドラキュラ Circle of the Moon Castlevania 白夜の協奏曲 Castlevania 暁月の円舞曲 FAMICOM MINI 29 悪魔城ドラキュラ NDS 悪魔城ドラキュラ蒼月の十字架 悪魔城ドラキュラ ギャラリー オブ ラビリンス 悪魔城ドラキュラ 奪われた刻印 PSP 悪魔城ドラキュラX クロニクル 駿河屋で購入 ニンテンドーDS
https://w.atwiki.jp/mdesign/
@wikiへようこそ ウィキはみんなで気軽にホームページ編集できるツールです。 このページは自由に編集することができます。 メールで送られてきたパスワードを用いてログインすることで、各種変更(サイト名、トップページ、メンバー管理、サイドページ、デザイン、ページ管理、等)することができます まずはこちらをご覧ください。 @wikiの基本操作 用途別のオススメ機能紹介 @wikiの設定/管理 おすすめ機能 気になるニュースをチェック 関連するブログ一覧を表示 その他にもいろいろな機能満載!! @wikiプラグイン @wiki便利ツール @wiki構文 バグ・不具合を見つけたら? お手数ですが、こちらからご連絡宜しくお願いいたします。 ⇒http //atwiki.jp/guide/contact.html 分からないことは? @wiki ご利用ガイド よくある質問 @wikiへお問い合わせ 等をご活用ください
https://w.atwiki.jp/gameswiki/pages/17.html
古いゲームなどのグラフィックやモデルをを差し替えたりするMod一覧です。 A. B. Battlefield 2 C. D. Doom Doom 2 E. F. Final Doom G. H. Half-Life Half-Life 2 Half-Life 2 Episode One Half-Life 2 Episode Two Heretic Hexen I. J. K. L. M. Minecraft N. O. P. Q. Quake Quake 2 R. S. Shadow Warrior T. The Elder Scrolls II Daggerfall The Elder Scrolls III Morrowind The Elder Scrolls IV Oblivion The Elder Scrolls V Skyrim U. W. X. Y. Z. あいうえお.
https://w.atwiki.jp/yaruoperformer/pages/1268.html
. ___ |ヽ、 > 、 -──- 、 __ ----- 、 _」_ヽ ' , --<、 ` ` /! , < `∨ , ‐-.' `>、__ / ̄二> / -ァ‐ ,!< | .`ヽ ヽ/ `ヽ、 / / >十 .廴__、 `ヽ \. / / / .∧ ト、 ヽ .ハ∧ _ ヽ、. / , ┐' .,イ i.,x‐‐ミ.ト、 !x-ミ .ト、 .ト ヽ ヽ `><.ヽ. ム ' レ!イ | /. んハ ヽ /,.‐.x`X ハ .ト 、! ` .! .∨ .从 ぅ_ソ. V.ぅ リ ア! / ヽ | ,i ∨ !xx ` ‐'xx./ .ハ レ ! .∨ .ト ヽノ , イ .∧ i ヽ!.ヽ ヽ_≧ .─ ≦'!./ ., イ / ヾ _ _ >! - }  ̄ {二`//イ/!/ rヽi .v.ヽ, へ , .ヘ ヽ, ' 7‐r'` 7ヽ、 __ __ _ ∧ ` .r' __ , 1 、/ 丁i ,X、 .ノ `ヽr‐ .∨/ノ ュ ヽ i-1-- | Y i `i |-> ,、 .| i ' ∠ 〉 , ' ̄` '二!_i | | .| .|_」ヽ_ ` , .-┘ `-.' | | | | | ! .ト L ' ヘ 〈 , -ヘ、 , .| ヽ ヽヽ ヽ.、` ┘ , < /.ヽ ./_ | |__∨ / \ \ / i ./ 〈` -┘ `个 ' ~ヽ' | .\ .ヽ、. i |' .> ゝ_ノノゝ、_ , < ヽ ! \. | ! ヽ 7__ ! _,イ、- __ノヽ ' `.i .ハ. | ヽ .|~ .|、`-‐v/ / .i ! , , - v ~ヾ-、--イ ./ ! ∨ , < ヽ .i i 〈---ィ `> 、 .ノ .V .ヽ,----i  ̄ `. i ̄ ̄ .! {`----'i  ̄ ̄ 名前:千歳ゆま(ちとせ ゆま) 性別:女 原作:魔法少女おりこ☆マギカ 一人称:ゆま 二人称: 口調:あどけない AA:魔法少女まどか☆マギカ/魔法少女おりこ☆マギカ/千歳ゆま.mlt 魔法少女の1人。 一人称は「ゆま」。 過去に父が蒸発し、母親から虐待を受け続けてきた。 そして魔女に親を殺され自身も狙われた所を佐倉杏子に救われて以降、 彼女を敬愛するようになる。 虐待の影響で役立たず扱いされる事を恐れており、杏子からは魔法少女になるのを反対されていたが 織莉子に唆され、魔女に殺されかけた杏子を救うべくキュゥべえと契約した。 その為固有魔法は回復。 キャラ紹介 やる夫Wiki Wikipedia アニヲタWiki ニコ百 ピクペ 登場作品リスト タイトル 原作 役柄 頻度 リンク 備考 やる夫は暗黒騎士からパラディンになるようです ファイナルファンタジーIV リディア役 常 まとめ やる夫Wiki 完結 ドルティー・マリー婦人の末路を知る者は誰もいないアディション オリジナル 子供時代のセラ・チャールズ 脇 登場回 まとめrss やらない夫はモンスターハンターになるようです モンスターハンターポータブル2ndG 羽阿保村の住人 脇 まとめ 完結 やる夫が導かれない者達-SKYRIM The Elder Scrolls V:SKYRIM スヴァリ役 脇 まとめ やる夫とカエルの為に鐘は鳴るようです カエルの為に鐘は鳴る エスキモー村の赤ずきん 脇 まとめ 予備 完結 短編 タイトル 原作 役柄 リンク 備考
https://w.atwiki.jp/skyrim_mod/pages/10.html
この項目ではやりたいことから調べられます。 やり方は一例であって必ずしもということはないので、他のパターンもあればぜひ記載してください。 ゲーム開始時に魔法やアイテムを自動で追加したい(初期化クエスト)ゲームロード度に動くスクリプト 常時稼動させるスクリプト DLCや特定のespが読み込まれてる場合に処理をする 一度のみ実行 名前アクターの名前の取得 場所の名前の取得 espファイルのゴミを消す 扉の開錠/施錠 オブジェクトの移動 新しいオブジェクトの設置簡単な例 スキーヴァーを大量発生させる例 SpawnerTaskを使用して大量発生させる FormList を使ったランダム設置の例 アクターの移動アクターの誘導 隊列の形成 倒した敵からコンテナードロップ キルムーブ時のイベントの取得 NPCのインベントリから見えない装備を外す方法 ラグドール状態の取得powerofthree's Papyrus ExtenderのGetActorKnockState関数を使う GetMass関数を使う(従来のやり方、SE版ではアクターに対しては非推奨) ラグドール中のモーション再生によるバグ 十進数と十六進数の変換十進数→十六進数 十六進数→十進数 攻撃側と防御側の位置と角度判定 コンソールやクロスヘアで選択した対象を取得 ゲーム内の時間取得ゲーム内時間の週を数値で返す ゲーム内時間の時間を数値で返す 判定処理対象の人が敵性であるかを返す 対象の人がフォロワーであるかを返す 対象の人が魔法使いであるかを返す 対象の人がクリーチャーであるかを返す 対象の人が人間男性であるかを返す 対象の人が人間女性であるかを返す 対象の人が戦闘継続可能であるかを返す パワーアタック判定The Ultimate Dodge Mod か Nemesis使用環境の場合 設備や器具の判定 盗み判定 配置オブジェクトの操作配置オブジェクトを一括で初期位置に戻す 配置オブジェクトを一括で固定化する 配置オブジェクトを一括で収集する 配置オブジェクトを一括で検知する NPCを操作する マップ・マーカーを表示する 対象の人の戦闘を強制停止させる 外見変更顔テキスチャの変更 髪パーツの変更 プレイヤーのヘッド・トラッキング 配列の要素数を128を超えたものを扱いたい、または動的に配列を宣言したいNGパターン 実装例 装備してる武器や防具に付いているエンチャントを取得する(自分で付呪したものも取得する方法) MCMの設定を保存、ゲーム開始時や再開時に設定を自動読込する ゲーム開始時に魔法やアイテムを自動で追加したい(初期化クエスト) MOD導入後に自動的にカスタマイズメニューの魔法やアイテムを追加するMODがあります。それのやり方です。 MOD導入後にセーブを読み込んだあとに一回しか動かないクエストです。 例としてカスタマイズメニューの魔法をプレイヤーに追加するクエストを作ります。 まず、Object WindowのCharacterツリーのQuestを選択します。 AchievementsQuestというのがあるので右クリック- Duplicateでコピー。 新規作成だとうまくいかない場合もあるので使えるクエストをコピーします。 コピーしたクエストを開いてIDと名前をつけます。(例 InitQuest) Priorityは99など高い数値にしておきます。 Start Game EnabledとRun at Onceにチェック。 そのままScriptsのボタンに移動して、要らないスクリプトをすべてRemove。 Addボタン- [New Script]でスクリプト新規作成。 extendsはQuest。 Spell property CustomMenuSpell(魔法名) auto Event oninit() Actor player = game.getplayer() if !(player.hasspell(CustomMenuSpell)) player.addspell(CustomMenuSpell) self.stop() endif endEvent Oninitは初期化した時に駆動するイベントです。 Oninitは同タイミングで二回読むっぽいので、重複防止のためにCustomMenuSpellを持っていない場合でしかプレイヤーに魔法を追加しません。 Run at Onceのため一度しか起動しないですが、念のためself.Stop()でクエストを止めます。 oninitはActorにつけても動きませんクエストで駆動するようにしましょう。 ゲームロード度に動くスクリプト Oninitだと一回だけで、OnLoadは正しく動作しないのでOnPlayerLoadGameを使います(skyrim1.6以上必要)。 ただこれはActorのPlayerにしか返さないので、直接QuestにスクリプトをつけるのではなくAlias(エイリアス)を経由させて使います。 まず、Object WindowのCharacterツリーのQuestを選択します。 AchievementsQuestというのがあるので右クリック- Duplicateでコピー。 コピーしたクエストを開いてIDと名前をつけます。(例 LoadQuest) Priorityは99など高い数値にしておきます。 Start Game Enabledにチェックが入ってるか確認。 そのままScriptsのボタンに移動して、スクリプトをすべてRemove。 Addボタン- [New Script]でスクリプト新規作成。 extendsはQuest。例ではTestLoadScriptと名前をつけました。 Scriptname TestLoadScript extends Quest Event OnInit() ; 自前の関数 LoadFunc() EndEvent ;実際の処理はここに書く Function LoadFunc() debug.notification("Hello Work!") EndFunction コンパイルしてスクリプトのウィンドウを閉じる。 Quest Aliasesボタン- 右クリック- New Referense Alias Aliasはplayerとでもしておく。 Unique ActorからPlayerを選ぶ。 ScriptのところをAddボタン- [New Script]でスクリプト新規作成。 TestLoadScript Property QuestScript Auto ; ↑QuestScript名 Event OnPlayerLoadGame() QuestScript.LoadFunc() EndEvent コンパイルしてスクリプトのウィンドウを閉じる。 Propertyで当クエストの指定も忘れずに。 常時稼動させるスクリプト ※できる限り使わないことを考えぬいてください。 常時稼働する事自体スクリプト(Papyrus)かそうでないかにかかわらず負荷がかかるために避けたほうが良いです。 とくに間隔の短いOnUpdateによるスクリプト回しは、環境にもよりますがスタックエラーにつながりやすいです。 OnUpdateとRegisterForSingleUpdate()を使います。 RegisterForUpdate()はスタックエラーの原因になりやすいので使いません。 つけたり止めたりしやすいのでクエストかマジックエフェクトで回します。 クエストの作り方は上記2つに書いてあるので省略。 例はプレイヤーがスニーク中かつ灯火使用中の場合は灯火を消します。 ;(マジックエフェクトの場合はEvent OnEffectStart) Event Oninit() RegisterForSingleUpdate(10) EndEvent Event OnUpdate() ;実際の処理はここ player = game.getplayer() if (player.isSneaking()) (player.HasSpell(Candlelight)) DispelSpell(Candlelight) endif ;10秒後OnUpdate開始。つまり10秒単位で回る。 RegisterForSingleUpdate(10) EndEvent に1秒など短い間隔でループさせると大量にスタックしてCTDの要因や他のスクリプトの遅延になります。 (OnUpdate内の記述によりますが)できれば2秒以上ゆとりを持って設定しましょう。 高速でループさせる必要があるかどうかをよく吟味して、何か単発のイベントで代替できるか探りましょう。 DLCや特定のespが読み込まれてる場合に処理をする GetFormFromFile()だと存在しない場合にログにエラーが出てしますのでGetModByName()を使います。 例ではドーンガード。 if Game.GetModByName("Dawnguard.esm") 255 ; ドーンガードがある場合の処理。別のespのフォームIDからFormを取得するには Game.GetFormFromFile(0x00000000,"Dawnguard.esm") else ;GetModByNameが255を返した場合読み込まれていません ;ドーンガードがない場合の処理 endIf 一度のみ実行 Oninit()などで絶対に一度のみしか走らないで欲しい処理などに Bool doOnce = False Event Oninit() if (doOnce) return else doOnce = True endif ;実際の処理はここ EndEvent 名前 アクターの名前の取得 対象アクターの名前を取得して左上に表示させたい時に、 debug.notification("ActorName " + Actor) とやってもスクリプト名やActorと表示されるだけなので、以下のようにアクターベースから名前を取得します。 debug.notification("ActorName "+ Actor.GetActorBase().GetName()) Actor actTarget;String szName; ; 現在のゲーム上で表示されている名前szName = actTarget.GetDisplayName(); ; 表示名の変更に影響されない元の設定名; レベルドリストから生成されたアクターの場合、空白になる場合がある。szName = actTarget.GetActorBase().GetName(); ; 表示名の変更に影響されない元の設定名; レベルドリストから生成されたアクターの場合でも、元になったActorBaseの名前が入る。; 通常のアクターの場合でも使えるので、設定名を取得する場合はこの方が確実。szName = actTarget.GetLeveledActorBase().GetName(); 場所の名前の取得 場所の名前をセル→ロケーション→ワールドの順に取得する。 屋外などでは、セルやロケーションに名前が設定されていない場合がある為。 celPlaceで指定したセルか、objrefMarkerで指定したリファレンスの場所名を返す。 ; ----------------------------------------------------------; @name getPlaceName; @function; @global; @param [celPlace=None] {Cell}; @param [objrefMarker=None] {ObjectReference}; @returns {String}; ----------------------------------------------------------String Function getPlaceName( \ Cell celPlace = None, \ ObjectReference objrefMarker = None \) global ;------------------------------------------------------- ; Init Variables ;------------------------------------------------------- Location locMarker; WorldSpace wsMarker; String szName = ""; ;------------------------------------------------------- ; Check Arguments ;------------------------------------------------------- If !celPlace objrefMarker celPlace = objrefMarker.GetParentCell(); Elseif celPlace !objrefMarker objrefMarker = celPlace.GetNthRef(0); Endif; !celPlace objrefMarker ;------------------------------------------------------- ; Get Cell Name ;------------------------------------------------------- If celPlace szName = celPlace.GetName(); Endif; celPlace ;------------------------------------------------------- ; Get Location Name ;------------------------------------------------------- If (szName == "") If objrefMarker locMarker = objrefMarker.GetCurrentLocation(); EndIf; objrefMarker If locMarker szName = locMarker.GetName(); Endif; locMarker Endif; (szName == "") ;------------------------------------------------------- ; Get World Name ;------------------------------------------------------- If (szName == "") If objrefMarker wsMarker = objrefMarker.GetWorldSpace(); EndIf; objrefMarker If wsMarker szName = wsMarker.GetName(); Endif; wsMarker Endif; (szName == "") ;------------------------------------------------------- ; Return ;------------------------------------------------------- return szName;EndFunction; getPlaceName() espファイルのゴミを消す 一度設定してしまったプロパティはespに保存されます。 その後、不要になった場合にそのまま消してしまうとPapyrus.logに以下のようなwarningメッセージを吐くespが出来上がります。 [12/24/2020 - 00 00 01PM] warning Property プロパティ名 on script スクリプト名 attached to オブジェクトのEDID (オブジェクトのformID) cannot be initialized because the script no longer contains that property espが自身に保存されたプロパティ情報を元に初期化しようとしたがスクリプトには存在しないために出る注意文で、新規ゲームでも関係なくメッセージを出します。 実害は無いですが邪魔な存在である事は確かなのでなるべくなら消しましょう。 消し方 消したいプロパティを選択後clear valueを押し defalult にする事でespから情報を削除出来ます。 設定後、CKを保存してespを更新するのを忘れないでください。 更新を忘れて、スクリプトからプロパティを削除してしまうと注意文は消えません。 消してしまった場合、一度スクリプトにプロパティを加えてコンパイルし直してください。 なお、これはセーブデータに残ってしまった情報とは違います。 こういうの↓ 12/24/2020 - 01 00 00PM] warning Could not find type オブジェクトのEDIDやAlias in the type table in save これはセーブデータに残ってしまった情報で確実な方法は発見されていません(2013/07/04現在) セーブデータに残ったスクリプト情報の残骸はSave game script cleanerというツールで消せます。 扉の開錠/施錠 サンプル ExampleUnlockDoor.zip(動かし方は中にある readme.txt を参照のこと) 扉の施錠判断には ObjectReference.IsLocked を使います。扉の開錠/施錠には ObjectReference.Lock を使います。 以下は、アクティベートイベントを元に、対象の扉が開いている場合は施錠/閉じている場合は解錠するスクリプトの例です。 Scriptname ExampleUnlockDoor extends ObjectReference ObjectReference Property targetDoor Auto Event OnActivate(ObjectReference akActionRef) if (targetDoor.IsLocked()) Debug.Notification("Unlock") targetDoor.Lock(false) else Debug.Notification("Lock") targetDoor.Lock(true) endIf endEvent targetDoor プロパティに事前に対象となる扉を指定する必要があります。 また、Creation Kit にて事前に扉の状態を決めるには Lock タブにある情報を設定します。 以下、スクリーンショットでは鍵を必要とする状態で扉を閉めています。 何らかのイベント等をトリガーに先に進めるようにする場合などに使えます。 オブジェクトの移動 サンプル ExampleMoveObject.zip(動かし方は中にある readme.txt を参照のこと) 設置済みのオブジェクトを移動させるには ObjectReference.SetPosition を使います。 以下はアクティベートした対象そのものを後ろへ移動させるスクリプトの例です。 Scriptname ExampleMoveObject extends ObjectReference Event OnActivate(ObjectReference akActionRef) SetPosition(x, y - 128, z) endEvent ObjectReference.SetPosition で指定する座標は、セル内の絶対座標系の値です。 ObjectReference には現在位置を表す x, y, z プロパティがあるので、それを使って相対位置を指定するのが常套手段です。 向きも変えたい場合は ObjectReference.SetAngle を併用します。 ※ポイント:この移動方法は、今の座標から徐々に指定の場所へ移動させるものではありません。ObjectReference.SetPosition は、瞬時の移動しかできません。徐々に移動させるには前提として対象が Actor である必要があります。 新しいオブジェクトの設置 簡単な例 サンプル ExampleSetObject.zip(動かし方は中にある readme.txt を参照のこと) オブジェクトを新しく設置するには ObjectReference.PlaceAtMe を使います。 第一引数に Form オブジェクトを指定します。 オブジェクト指向熟練者への補足ですが、以下の対比がちょうど当てはまると覚えておくと良いでしょう。 Form オブジェクト クラス ObjectReference.PlaceAtMe new 演算子 ObjectReference オブジェクト インスタンス 以下(ExampleSetObject サンプル)はアクティベートする度に WETempActivator が後ろに増えていくスクリプトの例です。 Scriptname ExampleSetObject extends ObjectReference Activator Property setObject Auto int count = 0 Event OnActivate(ObjectReference akActionRef) count = count + 1 ObjectReference newObject = PlaceAtMe(setObject, 1) newObject.SetPosition(x, y - count * 128, z) endEvent サンプルは WETempActivator を新しく設置するものですが、他のものでも Form オブジェクトがあれば新しいオブジェクトを生成できます。 スキーヴァーを大量発生させる例 サンプル ExampleSetSkeever.zip(動かし方は中にある readme.txt を参照のこと) アクティベートするたびにスキーヴァーが部屋のどこかに設置されるサンプルです。 Scriptname ExampleSetSkeever extends ObjectReference ActorBase Property skeever Auto Event OnActivate(ObjectReference akActionRef) float newx = -1000 + 2000 * Utility.RandomFloat() float newy = -1000 + 2000 * Utility.RandomFloat() Actor newActor = PlaceAtMe(skeever, 1) as Actor newActor.SetPosition(newx, newy, z) newActor.StopCombat() endEvent skeever プロパティには「EncSkeever」が設定してあります。何度もアクティベートすれば当然…。 囲まれます。 SpawnerTaskを使用して大量発生させる SpawnerTaskを使えば、敵やオブジェクトを効率よくスポーンさせることが出来ます。 下記の例では、PCの周囲に一気に出現させています。 Bool Function spawnAroundPlayer(Form frmTarget, Int nAddNum = 1) ;------------------------------------------------------- ; Init Variables ;------------------------------------------------------- Actor actPlayer = Game.GetPlayer(); Float[] aPos = new Float[3]; Float[] aRot = new Float[3]; Int nTaskID; ;------------------------------------------------------- ; Spawn ;------------------------------------------------------- If frmTarget (nAddNum 0) nTaskID = SpawnerTask.Create(); SpawnerTask.AddSpawn( \ nTaskID, frmTarget, actPlayer, aPos, aRot, nAddNum); SpawnerTask.Run(nTaskID); Endif; frmTarget (nAddNum 0) ;------------------------------------------------------- ; Return ;------------------------------------------------------- return true;EndFunction; spawnAroundPlayer() FormList を使ったランダム設置の例 サンプル ExampleSetRandomObject.zip(動かし方は中にある readme.txt を参照のこと) アクティベートするたびに FormList の中にある何かが部屋のどこかに設置されるサンプルです。 FormList には ObjectWindow の「WorldObjects/Tree/Plants」カテゴリにある植物群が入っており、設置後、素材を採集できます。 Scriptname ExampleSetRandomObject extends ObjectReference FormList Property flowers Auto Event OnActivate(ObjectReference akActionRef) float newx = -1000 + 2000 * Utility.RandomFloat() float newy = -1000 + 2000 * Utility.RandomFloat() Debug.Notification("Activate ... new object (" + newx + ", " + newy + ")") ObjectReference newObject = PlaceAtMe(flowers.GetAt(Utility.RandomInt(0, flowers.GetSize() - 1)), 1) newObject.SetPosition(newx, newy, z) endEvent アクターの移動 アクターの誘導 サンプル ExampleSkeeverAroundStone.zip(動かし方は中にある readme.txt を参照のこと) アクターとは動きまわるオブジェクトのことです。プレイヤーや敵やNPCなどが該当します。 「オブジェクトの移動」で紹介した ObjectReference.SetPosition は瞬時の移動です。誘導には Actor.PathToReference を使います。 誘導する際、移動先のオブジェクトを指定する必要があります。ObjectReference であれば何でも良いですが、もしも自由に誘導させたいならば XMarker を使うのがお勧めです。 Scriptname ExampleSkeeverAroundStone extends ObjectReference Actor Property skeever Auto ObjectReference Property destination Auto int angle = 0 Event OnCellLoad() RegisterForSingleUpdate(1) endEvent Event OnUpdate() float distance = skeever.GetDistance(destination) if (distance 64) angle = angle + 45 destination.SetPosition(x + 256 * Math.cos(angle), y + 256 * Math.sin(angle), z) endIf skeever.PathToReference(destination, 0.5) RegisterForSingleUpdate(1) endEvent 以上のサンプルはスキーヴァーが石碑の周りをぐるぐると回らせるものです。 destination に XMarker をセットし、スキーヴァーの到着を判断して位置を変えていきます。 また、本サンプルは「常時稼動させるスクリプト」のサンプルにもなっています。 隊列の形成 KeepOffsetFromActor()を使えば、対象のアクターを別のアクターの隣や背後といった定位置に移動させることが出来る。 隊列の形成などは、この手法が使われていることが多い。 Actor actTarget;Actor actFollow; actTarget.KeepOffsetFromActor( \ actFollow, \ 170.0, -170.0, 0.0, \ afCatchUpRadius = 260.0, \ afFollowRadius = 8.0 ); 倒した敵からコンテナードロップ サンプル ExampleDropChest.zip(動かし方は中にある readme.txt を参照のこと) 敵を倒した際、コンテナーをドロップさせてアイテムをゲットできるようにしてみましょう。 方法は簡単です。Actor.OnDeath イベントで敵が倒されたタイミングを見計らい コンテナーを設置 敵を排除 するだけです。以下、事例です。 Scriptname ExampleDropChest extends ObjectReference Container Property BaseChest Auto Event OnDeath(Actor akKiller) ObjectReference chest = PlaceAtMe(BaseChest, 1) Disable(false) Delete() chest.SetAngle(0, 0, chest.z) EndEvent BaseChest に事前にドロップさせるコンテナーをセットしておく必要があります。 コンテナーを設置したら、敵本体を即時に無効にして削除します。 サンプルではスキーヴァー(EncSkeever)がフィールドにいます。倒すと空の宝箱(TreasDraugrChestEMPTYSmall)がドロップします。 最後にアングルを変えているのは、敵が死亡時、横たわるのでそれに合わせて宝箱も傾いてしまうのを補正するためです。 キルムーブ時のイベントの取得 要:SKSE Event Init() RegisterForCameraState();まず別のイベントで登録する EndEvent Event OnPlayerCameraState() if newState == 2 ;キルムーブのカメラ切り替え EndIf EndEvent NPCのインベントリから見えない装備を外す方法 単に今着ている装備を外すだけだと、ロードを挟んだ際に元々着ていた服に戻ります。 これを防ぐためには透明な装備を登録したOutfitをSetすればよいです。 価値を0にしておけば別の装備を渡したときにそちらを優先してきてくれます。 なおOutfitをSetすると元の服装に戻らなくなるため、予め回収しておくのもよいでしょう。 Outfit Property NakedOutfit Auto ; AAの無い装備を一つ登録したOutfit Function ExampleFunction(Actor akNPC) ; 単に今着ている装備を外したい場合 akNPC.UnequipAll() akNPC.RemoveAllItems() ; アイテムを回収したい場合は自分を指定 ; akNPC.RemoveAllItems(Game.GetPlayer()) ; 恒久的に装備を外してしまいたい場合 akNPC.SetOutfit(NakedOutfit) EndFunction ラグドール状態の取得 ラグドールはフスロダなどで吹っ飛んでいるとき、または死亡時の手足がブラブラした状態のことです。 判定方法は二通りありますが片方はアクターが『フロスダやマヒ等で倒れているか』を判定する時に使い、 もう片方はオブジェクトが重力の影響下や固定されてるオブジェであるかの判定に使う事を推奨します。(理由は後述) powerofthree's Papyrus ExtenderのGetActorKnockState関数を使う こちらは対象がアクターでより正確にラグドール状態を取得したい場合に有効となります。 GetActorKnockState関数はアクターがフロスダやマヒ(あるいはPushActorAway)等で倒れてラグドール状態になり、起き上がりが終わるまでは0以外を返します。 ただし、あくまで死亡以外の要因でラグドール状態になった時に判定するためのもので、死亡が原因でラグドールになった場合はGetActorKnockStateは0を返すためIsDeadによるチェックも必要です。 (マヒ状態や吹っ飛んでる途中で死亡した場合はGetActorKnockStateは0以外を返します) ; ----------------------------------------------------------; @name isInRagdollActor; @desc 対象の人物がフロスダ等によるラグドール影響下にあるかを返す; @function; @global; @param actTarget {Actor} 対象の人; @param isDeadRagdollCheck {Bool} 死亡からラグドール状態に移行した場合を考慮するか; @returns {Bool} 影響下にあればtrue; ----------------------------------------------------------Bool Function isInRagdollActor(Actor actTarget, Bool isDeadRagdollCheck = true) global ;------------------------------------------------------- ; Init Variables ;------------------------------------------------------- Bool isInRagdoll = false; ;------------------------------------------------------- ; Checking Ragdoll Status ;------------------------------------------------------- If actTarget ; 死亡時にラグドール状態に移行する場合はGetActorKnockStateは0を返すため ; 従来のGetMass関数による判定と同じ挙動を行いたい時はIsDeadのチェックを加える If (PO3_SKSEFunctions.GetActorKnockState(actTarget) != 0) isInRagdoll = true ElseIf isDeadRagdollCheck isInRagdoll = actTarget.IsDead() EndIf Endif; actTarget ;------------------------------------------------------- ; Return ;------------------------------------------------------- return isInRagdoll;EndFunction; isInRagdollActor() GetMass関数を使う(従来のやり方、SE版ではアクターに対しては非推奨) アクターが吹っ飛んでいるかの判定では最もメジャーな方法でしたが、Precisionの登場により事情が変わりました。 このMod環境下では武器攻撃の判定をより正確な判定にするのにHavok衝突判定を使うため、アクターに対してアクティブラグドールというものを付与されるようになります。 その影響でこのModの環境下の場合はアクターがラグドール状態でなくてもGetMassが0以外を返すようになります。 そのため、Precision環境下でアクターがふっ飛ばされてラグドールになってるかをGetMass関数で判定すると問題が発生する可能性があるため注意が必要です。 Precision環境でない場合はアクターに対するGetMass関数は通常時は常に0を返しますが、ラグドール中だけは設定されているラグドールの計算に使う重量(Mass)を返します。 ※フロスダなどで吹っ飛んでから静止すると起き上がりモーションが発生しますが、このモーション中もラグドール扱いとして0以外を返します。 Precision環境下でなくても今後出てくるModによってはGetMass関数がアクターに対して通常時でも0以外を返すようになる可能性があるため前述のGetActorKnockState関数でラグドール判定を行う事を推奨します。 例: if Game.GetPlayer().GetMass() == 0 ;ラグドール中じゃないとき debug.SendAnimationEvent(Game.GetPlayer(),"staggerStart") endif ; ----------------------------------------------------------; @name isInRagdoll; @desc 対象の人や物がラグドール影響下にあるかを返す; @function; @global; @param obrfThis {ObjectReference} 対象の人や物; @returns {Bool} 影響下にあればtrue; ----------------------------------------------------------Bool Function isInRagdoll(ObjectReference obrfThis) global ;------------------------------------------------------- ; Init Variables ;------------------------------------------------------- Bool isInRagdoll = false; ;------------------------------------------------------- ; Checking Ragdoll Status ;------------------------------------------------------- If obrfThis (obrfThis.GetMass() != 0) isInRagdoll = true; Endif; obrfThis (obrfThis.GetMass() != 0) ;------------------------------------------------------- ; Return ;------------------------------------------------------- return isInRagdoll;EndFunction; isInRagdoll() ラグドール中のモーション再生によるバグ ラグドール中あるいは起き上がってる途中に別のモーションを再生すると、その場で固定されて行動不能になるバグがあります。ラグドール中は基本的に別のモーションでは割り込めないですが、ドラウグルはよろめき(StaggerStart)が割り込めてしまうので、上記の条件で除外しましょう。 十進数と十六進数の変換 Papyrusには、こういった標準的な関数がないので不便する場合がある。 十進数→十六進数 ; ----------------------------------------------------------; @name convDecToHex; @desc 整数値を十六進数表記の文字列に変換; @function; @global; @param nNum {Int} 変換したい整数値; @returns {String} 十六進数表記の文字列; ----------------------------------------------------------String Function convDecToHex(Int nNum) global ;------------------------------------------------------- ; Init Variables ;------------------------------------------------------- String szHex; Bool isNegative; Int[] aNums = new Int[8]; String[] aHex = new String[8]; Int nIdx = 0; Int nLen = aNums.Length; ;------------------------------------------------------- ; Checking over 0x80000000 ;------------------------------------------------------- If (nNum 0) isNegative = True; nNum += 0x80000000; Endif ;------------------------------------------------------- ; Parse integer ;------------------------------------------------------- aNums[0] = (nNum / 0x10000000); nNum -= (aNums[0] * 0x10000000); aNums[1] = (nNum / 0x01000000); nNum -= (aNums[1] * 0x01000000); aNums[2] = (nNum / 0x00100000); nNum -= (aNums[2] * 0x00100000); aNums[3] = (nNum / 0x00010000); nNum -= (aNums[3] * 0x00010000); aNums[4] = (nNum / 0x00001000); nNum -= (aNums[4] * 0x00001000); aNums[5] = (nNum / 0x00000100); nNum -= (aNums[5] * 0x00000100); aNums[6] = (nNum / 0x00000010); nNum -= (aNums[6] * 0x00000010); aNums[7] = nNum; ;------------------------------------------------------- ; Convert to HEX ;------------------------------------------------------- If isNegative aNums[0] = aNums[0] + 8; Endif While (nIdx nLen) If (aNums[nIdx] == 10) aHex[nIdx] = "A"; Elseif (aNums[nIdx] == 11) aHex[nIdx] = "B"; Elseif (aNums[nIdx] == 12) aHex[nIdx] = "C"; Elseif (aNums[nIdx] == 13) aHex[nIdx] = "D"; Elseif (aNums[nIdx] == 14) aHex[nIdx] = "E"; Elseif (aNums[nIdx] == 15) aHex[nIdx] = "F"; Else aHex[nIdx] = (aNums[nIdx] as String); Endif nIdx += 1; EndWhile ;------------------------------------------------------- ; Join characters ;------------------------------------------------------- szHex = aHex[0] + aHex[1] + aHex[2] + aHex[3] \ + aHex[4] + aHex[5] + aHex[6] + aHex[7]; ;------------------------------------------------------- ; Return ;------------------------------------------------------- return szHex;EndFunction; convDecToHex() 十六進数→十進数 ; ----------------------------------------------------------; @name convHexToDec; @desc 十六進数表記の文字列を整数値で応答; @function; @global; @param szHex {String} 十六進数表記の文字列; @returns {Int} 変換した整数値; ----------------------------------------------------------Int Function convHexToDec(String szHex) global ;------------------------------------------------------- ; Init Variables ;------------------------------------------------------- Int nIdx = 0; Int nLen = StringUtil.GetLength(szHex); String cChar; Int nNum; Int nRet; ;------------------------------------------------------- ; Parse Hex-String ;------------------------------------------------------- While (nIdx nLen) cChar = StringUtil.GetNthChar(szHex, nIdx); If StringUtil.IsDigit(cChar) nNum = cChar as Int; Elseif (cChar == "A") || (cChar == "a") nNum = 10; Elseif (cChar == "B") || (cChar == "b") nNum = 11; Elseif (cChar == "C") || (cChar == "c") nNum = 12; Elseif (cChar == "D") || (cChar == "d") nNum = 13; Elseif (cChar == "E") || (cChar == "e") nNum = 14; Elseif (cChar == "F") || (cChar == "f") nNum = 15; Else nNum= 0; Endif nNum = (nNum * Math.pow(16, (nLen - (nIdx + 1)))) as Int; nRet += nNum; nIdx += 1 EndWhile ;------------------------------------------------------- ; Return ;------------------------------------------------------- return nRet;EndFunction; convHexToDec() 攻撃側と防御側の位置と角度判定 バックスタブなどのMODで使われる手法。二者の相対的な距離と角度から判定している。 ; ----------------------------------------------------------; @name getAttackAngle; @desc 攻撃側と防御側の向きと距離のタイプを返す; @function; @global; @param actAtk {Actor} 攻撃側の人; @param actDef {Actor} 防御側の人; @param [nCloseRange=170.0] {Float} 近接と判断する距離限界; @param [nFrontAngle=44.0] {Float} 正面と判断する角度限界; @param [nRearAngle=125.0] {Float} 背面と判断する角度限界; @returns {Int}; 距離のタイプとして、以下を返す; -1 以下のどれでもない、または処理エラー; 11 正面近距離; 12 背面近距離; 21 正面遠距離; 22 背面遠距離; ----------------------------------------------------------Int Function getAttackAngle( \ Actor actAtk, \ Actor actDef, \ Float nCloseRange = 170.0, \ Float nFrontAngle = 44.0, \ Float nRearAngle = 125.0 \) global ;------------------------------------------------------- ; Init Variables ;------------------------------------------------------- Int nRet = -1; Float nFaceMin; Float nFaceMax; Float nRearMin; Float nRearMax; Float nDist; Float nAngleAtk; Float nAngleDef; ;------------------------------------------------------- ; Check Arguments ;------------------------------------------------------- If !actAtk || !actDef || (actAtk == actDef) return nRet; Endif; !actAtk || !actDef || (actAtk == actDef) If (nCloseRange 0.0) nCloseRange *= -1.0; Endif; (nCloseRange 0.0) If (nFrontAngle 0.0) nFrontAngle *= -1.0; Endif; (nFrontAngle 0.0) If (nFrontAngle 90.0) nFrontAngle = 90.0; Endif; (nFrontAngle 90.0) If (nRearAngle 0.0) nRearAngle *= -1.0; Endif; (nRearAngle 0.0) If (nRearAngle 90.0) nRearAngle = 90.0; Elseif (nRearAngle 180.0) nRearAngle = 180.0; Endif; (nRearAngle 90.0) ;------------------------------------------------------- ; Init Range Values ;------------------------------------------------------- nFaceMin = nFrontAngle * -1.0; nFaceMax = nFrontAngle; nRearMin = nRearAngle * -1.0; nRearMax = nRearAngle; ;------------------------------------------------------- ; Get Distance and Angles ;------------------------------------------------------- nDist = actAtk.GetDistance(actDef); nAngleAtk = actAtk.GetHeadingAngle(actDef); nAngleDef = actDef.GetHeadingAngle(actAtk); ;------------------------------------------------------- ; Check Distance ;------------------------------------------------------- If (nDist = nCloseRange) nRet = 10; Else nRet = 20; Endif; (nDist = nCloseRange) ;------------------------------------------------------- ; Check Defender Angle ;------------------------------------------------------- If (nAngleAtk = nFaceMin) (nAngleAtk = nFaceMax) If (nAngleDef = nFaceMin) \ (nAngleDef = nFaceMax) nRet += 1; Elseif (nAngleDef = nRearMin) \ || (nAngleDef = nRearMax) nRet += 2; Else nRet = -1; Endif; (nDist = nCloseRange) ... Else nRet = -1; Endif; (nAngleAtk = nFaceMin) ... ;------------------------------------------------------- ; Return ;------------------------------------------------------- return nRet;EndFunction; getAttackAngle() コンソールやクロスヘアで選択した対象を取得 コンソールやクロスヘアで選択中のオブジェクトのリファレンスを取得したい場合の処理。 Game.GetCurrentConsoleRef()は昔のSKSEではサポートしていなかった関数なので、念の為にバージョンをチェックしている。 ; ----------------------------------------------------------; @name getObjectSelected; @desc 選択中のオブジェクトを取得する; @function; @global; @param [enableCrosshair=True] {Bool}; クロスヘア選択を有効にする; @param [enableConsole=True] {Bool}; コンソール選択を有効にする; @returns {ObjectReference}; 取得した収納オブジェクト; ----------------------------------------------------------ObjectReference Function getObjectSelected( \ Bool enableCrosshair = True, \ Bool enableConsole = True \) global ;------------------------------------------------------- ; Init Variables ;------------------------------------------------------- ObjectReference obrfFind; Int nSkseVer = SKSE.GetScriptVersionRelease(); ;------------------------------------------------------- ; Console selected ;------------------------------------------------------- If !obrfFind enableConsole (nSkseVer 47) obrfFind = \ Game.GetCurrentConsoleRef() as ObjectReference; Endif ;------------------------------------------------------- ; Crosshair ;------------------------------------------------------- If !obrfFind enableCrosshair obrfFind = \ Game.GetCurrentCrosshairRef() as ObjectReference; Endif ;------------------------------------------------------- ; Return ;------------------------------------------------------- Return obrfFind;EndFunction; getObjectSelected() ゲーム内の時間取得 Utility.GetCurrentGameTime()でゲーム内の経過日数を取得してから計算する。 ゲーム内時間の週を数値で返す ; ----------------------------------------------------------; @name getCurrentWeekIdx; @desc ゲーム内時間の週を数値で返す; @function; @global; @returns {Int} 週を示す整数値(0 - 6); ----------------------------------------------------------Int Function getCurrentWeekIdx() global ;------------------------------------------------------- ; Init Variables ;------------------------------------------------------- Float nGameTime = Utility.GetCurrentGameTime(); Int nDays = Math.Floor(nGameTime); Int nWeeks = Math.Floor(nDays / 7); Int nWeekIdx = nDays - (nWeeks * 7); ;------------------------------------------------------- ; Return ;------------------------------------------------------- return nWeekIdx;EndFunction; getCurrentWeekIdx() ゲーム内時間の時間を数値で返す ; ----------------------------------------------------------; @name getCurrentHour; @desc ゲーム内時間の時間を数値で返す; @function; @global; @returns {Int} 時間を示す整数値(0 - 23); ----------------------------------------------------------Int Function getCurrentHour() global ;------------------------------------------------------- ; Init Variables ;------------------------------------------------------- Float nGameTime = Utility.GetCurrentGameTime(); Int nDays = Math.Floor(nGameTime); Int nHours = Math.Floor((nGameTime - nDays) * 24); ;------------------------------------------------------- ; Return ;------------------------------------------------------- return nHours;EndFunction; getCurrentHour() 判定処理 様々な判定を行う処理の例。 対象の人が敵性であるかを返す この例では、敵と判定する為の3つの条件を組み合わせている。 ; ----------------------------------------------------------; @name isEnemy; @desc 対象の人が敵性であるかを返す; @function; @global; @param actEnemy {Actor} 対象の人; @param [actTarget=None] {Actor}; 誰に対する敵かを指定(None時はプレイヤーに対する敵); @returns {Bool} 敵性であればtrue; ----------------------------------------------------------Bool function isEnemy(Actor actEnemy, Actor actTarget = None) global ;------------------------------------------------------- ; Init Variables ;------------------------------------------------------- Bool isEnemy = false; Int nReaction; Int nRank; ;------------------------------------------------------- ; Check Argument ;------------------------------------------------------- If !actEnemy return isEnemy; Elseif !actTarget actTarget = Game.GetPlayer(); Endif; !actEnemy ;------------------------------------------------------- ; Check Actor ;------------------------------------------------------- If (actEnemy == actTarget) return isEnemy; Endif; (actEnemy == actTarget) ;------------------------------------------------------- ; Check Hostile ;------------------------------------------------------- If !isEnemy isEnemy = actEnemy.IsHostileToActor(actTarget); Endif; !isEnemy ;------------------------------------------------------- ; Check Reaction ;------------------------------------------------------- If !isEnemy ; Obtains this actors faction-based reaction ; to the other actor ; 0 - Neutral ; 1 - Enemy ; 2 - Ally ; 3 - Friend nReaction = actEnemy.getFactionReaction(actTarget); isEnemy = (nReaction == 1); Endif; !isEnemy ;------------------------------------------------------- ; Check Relationship ;------------------------------------------------------- If !isEnemy ; Relationship functions use the following values ; 4 - Lover ; 3 - Ally ; 2 - Confidant ; 1 - Friend ; 0 - Acquaintance ; -1 - Rival ; -2 - Foe ; -3 - Enemy ; -4 - Archnemesis nRank = actEnemy.GetRelationshipRank(actTarget); isEnemy = (nRank = -2); Endif; !isEnemy ;------------------------------------------------------- ; Return ;------------------------------------------------------- return isEnemy;EndFunction; isEnemy() 対象の人がフォロワーであるかを返す フォロワーMODを使用している場合では、判定条件が異なるかも知れない。 ; ----------------------------------------------------------; @name isFollower; @desc 対象の人がフォロワーであるかを返す; @function; @global; @param actTarget {Actor} 対象の人; @returns {Bool} フォロワーであればtrue; ----------------------------------------------------------Bool Function isFollower(Actor actTarget) global ;------------------------------------------------------- ; Init Variables ;------------------------------------------------------- Faction[] aFollower; Bool isFollower = false; ;------------------------------------------------------- ; Get Factions ;------------------------------------------------------- ; CurrentFollowerFaction 0x5C84E ; CurrentHireling 0xBD738 aFollower = new Faction[2]; aFollower[0] = Game.GetForm(0x5C84E) As Faction; aFollower[1] = Game.GetForm(0xBD738) As Faction; ;------------------------------------------------------- ; Check Factions ;------------------------------------------------------- If actTarget.IsInFaction(aFollower[0]) \ || actTarget.IsInFaction(aFollower[1]) isFollower = true; Endif; actTarget.IsInFaction(aFollower[0]) || ... ;------------------------------------------------------- ; Return ;------------------------------------------------------- return isFollower;EndFunction; isFollower() 対象の人が魔法使いであるかを返す この例では、戦闘スタイルで魔法使いかを判定している。 この判定条件が有効かどうかは、使う場面による。 ; ----------------------------------------------------------; @name isMagicUser; @desc 対象の人が魔法使いであるかを返す; @function; @global; @param actTarget {Actor} 対象の人; @returns {Bool} 魔法使いであればtrue; ----------------------------------------------------------Bool Function isMagicUser(Actor actTarget) global ;------------------------------------------------------- ; Init Variables ;------------------------------------------------------- ActorBase abTarget = actTarget.GetLeveledActorBase(); CombatStyle csTarget = abTarget.GetCombatStyle(); Float nMeleeMult = csTarget.GetMeleeMult(); Float nMagicMult = csTarget.GetMagicMult(); Float nRangedMult = csTarget.GetRangedMult(); Bool isMagicUser = false; ;------------------------------------------------------- ; Check ;------------------------------------------------------- If (nMagicMult nMeleeMult) || (nMagicMult nRangedMult) isMagicUser = true; Endif; (nMagicMult nMeleeMult) || (nMagicMult nRangedMult) ;------------------------------------------------------- ; Return ;------------------------------------------------------- return isMagicUser;EndFunction; isMagicUser() 対象の人がクリーチャーであるかを返す この例では、人間タイプでないことをクリーチャーの条件としている。 MODで、ActorTypeCreatureのキーワードがないクリーチャーが多い為。 良し悪しあるので、ケェス・バイ・ケェスではある。 ; ----------------------------------------------------------; @name isCreature; @desc 対象の人がクリーチャーであるかを返す; @function; @global; @param actTarget {Actor} 対象の人; @returns {Bool} クリーチャーであればtrue; ----------------------------------------------------------Bool Function isCreature(Actor actTarget) global ;------------------------------------------------------- ; Init Variables ;------------------------------------------------------- ActorBase abTarget = actTarget.GetLeveledActorBase(); Int nSex = abTarget.GetSex(); Bool isCreature = false; ;------------------------------------------------------- ; Check Keyword ;------------------------------------------------------- If !actTarget.HasKeywordString("ActorTypeNPC") isCreature = true; Elseif (nSex == -1) isCreature = true; Endif; !actTarget.HasKeywordString("ActorTypeNPC") ;------------------------------------------------------- ; Return ;------------------------------------------------------- return isCreature;EndFunction; isCreature() 対象の人が人間男性であるかを返す ; ----------------------------------------------------------; @name isMale; @desc 対象の人が人間男性であるかを返す; @function; @global; @param actTarget {Actor} 対象の人; @returns {Bool} 人間男性であればtrue; ----------------------------------------------------------Bool Function isMale(Actor actTarget) global ;------------------------------------------------------- ; Init Variables ;------------------------------------------------------- ActorBase abTarget = actTarget.GetLeveledActorBase(); Int nSex = abTarget.GetSex(); Bool isMale = false; ;------------------------------------------------------- ; Check Keyword ;------------------------------------------------------- If !actTarget.HasKeywordString("ActorTypeNPC") isMale = false; Elseif (nSex == 0) isMale = true; Endif; !actTarget.HasKeywordString("ActorTypeNPC") ;------------------------------------------------------- ; Return ;------------------------------------------------------- return isMale;EndFunction; isMale() 対象の人が人間女性であるかを返す ; ----------------------------------------------------------; @name isFemale; @desc 対象の人が人間女性であるかを返す; @function; @global; @param actTarget {Actor} 対象の人; @returns {Bool} 人間女性であればtrue; ----------------------------------------------------------Bool Function isFemale(Actor actTarget) global ;------------------------------------------------------- ; Init Variables ;------------------------------------------------------- ActorBase abTarget = actTarget.GetLeveledActorBase(); Int nSex = abTarget.GetSex(); Bool isFemale = false; ;------------------------------------------------------- ; Check Keyword ;------------------------------------------------------- If !actTarget.HasKeywordString("ActorTypeNPC") isFemale = false; Elseif (nSex == 1) isFemale = true; Endif; !actTarget.HasKeywordString("ActorTypeNPC") ;------------------------------------------------------- ; Return ;------------------------------------------------------- return isFemale;EndFunction; isFemale() 対象の人が戦闘継続可能であるかを返す その瞬間に継続可能かどうかの判定。GetMass()はラグドール状態かの判定。 ; ----------------------------------------------------------; @name canCombat; @desc 対象の人が戦闘継続可能であるかを返す; @function; @global; @param [actTarget=None] {Actor}; 対象の人 (None時はプレイヤーが対象); @returns {Bool} ; 戦闘継続可能であればtrue; ----------------------------------------------------------Bool Function canCombat(Actor actTarget = None) global ;------------------------------------------------------- ; Init Variables ;------------------------------------------------------- Bool canCombat = true; ;------------------------------------------------------- ; Checking Actor ;------------------------------------------------------- If !actTarget actTarget = Game.GetPlayer(); Endif; !actTarget ;------------------------------------------------------- ; Checking Keywords ;------------------------------------------------------- If !actTarget.Is3DLoaded() \ || actTarget.IsDisabled() \ || actTarget.IsDead() \ || actTarget.IsUnconscious() \ || actTarget.IsBleedingOut() \ || (actTarget.GetMass() != 0) canCombat = false; Endif; !actTarget.Is3DLoaded() || ... ;------------------------------------------------------- ; Return ;------------------------------------------------------- return canCombat;EndFunction; canCombat() パワーアタック判定 スプリント攻撃以外はアニメーション変数「bAllowRotation」で判定できる。 ; Animation event, sent when an object we are listening ; to hits one of the events we are listening for Event OnAnimationEvent(ObjectReference akSource, string asEventName) ;------------------------------------------------------- ; Init Variables ;------------------------------------------------------- Actor actTarget = akSource as Actor; Bool isPowerAtk = true; ;------------------------------------------------------- ; Check Power Attack ;------------------------------------------------------- If (asEventName == "weaponSwing") \ || (asEventName == "weaponLeftSwing") isPowerAtk = \ actTarget.GetAnimationVariableBool( \ "bAllowRotation" ); Endif; (szEvent == "weaponSwing") || ...EndEvent; OnAnimationEvent() The Ultimate Dodge Mod か Nemesis使用環境の場合 The Ultimate Dodge Modを使用している場合か、 アニメーション管理ツールのNemesis実行時に「The Ultimate Dodge Mod」にチェックを入れて処理した場合、人間NPCのアニメーションから受信できるAnimationEventが増える。 通常攻撃時は"NextAttackInitiate"、パワーアタック時は"NextPowerAttackInitiate"が発生する。 (スプリントのパワーアタック時も"NextPowerAttackInitiate"が発生する) Event OnAnimationEvent(ObjectReference akSource, string asEventName) ;------------------------------------------------------- ; Init Variables ;------------------------------------------------------- Bool isPowerAtk = false; ;------------------------------------------------------- ; Check Power Attack ;------------------------------------------------------- If (asEventName == "NextAttackInitiate") isPowerAtk = false ElseIf (asEventName == "NextPowerAttackInitiate") isPowerAtk = true Endif; (asEventName == "NextAttackInitiate") ElseIf ...EndEvent; OnAnimationEvent() 設備や器具の判定 設備や器具であるかを判定する為の処理例。 基本的には、キーワードで判定することが可能。 椅子などは、キーワードで判定できない場合もあるので注意。 ; ----------------------------------------------------------; @name isSittingObject; @desc 対象のオブジェクトが座るタイプの家具かどうか; @function; @global; @param obrfTarget {ObjectReference} 対象のオブジェクト; @returns {Bool}; 座るタイプの家具の場合はtrue; ----------------------------------------------------------Bool Function isSittingObject(ObjectReference obrfTarget) global ;------------------------------------------------------- ; Init Variables ;------------------------------------------------------- Bool isObject = false; Form frmTarget = obrfTarget.GetBaseObject(); ;------------------------------------------------------- ; Check the name in the name list ;------------------------------------------------------- ; IsTable [KYWD 0009B9A9] ; isBarStool [KYWD 00074EC7] If frmTarget.HasKeywordString("IsTable") \ || frmTarget.HasKeywordString("isBarStool") isObject = true; Endif; frmTarget.HasKeywordString("IsTable") || ... ;------------------------------------------------------- ; Return ;------------------------------------------------------- return isObject;EndFunction; isSittingObject() ; ----------------------------------------------------------; @name isSleepingObject; @desc 対象のオブジェクトが寝るタイプの家具かどうか; @function; @global; @param obrfTarget {ObjectReference} 対象のオブジェクト; @returns {Bool}; 寝るタイプの家具の場合はtrue; ----------------------------------------------------------Bool Function isSleepingObject(ObjectReference obrfTarget) global ;------------------------------------------------------- ; Init Variables ;------------------------------------------------------- Bool isObject = false; Form frmTarget = obrfTarget.GetBaseObject(); ;------------------------------------------------------- ; Check the name in the name list ;------------------------------------------------------- ; FurnitureBedRoll [KYWD 000E4AD6] If frmTarget.HasKeywordString("FurnitureBedRoll") isObject = true; Endif; frmTarget.HasKeywordString("FurnitureBedRoll") ;------------------------------------------------------- ; Return ;------------------------------------------------------- return isObject;EndFunction; isSleepingObject() ; ----------------------------------------------------------; @name isAlchemyLab; @desc 対象のオブジェクトが錬金器具かどうか; @function; @global; @param obrfTarget {ObjectReference} 対象のオブジェクト; @returns {Bool}; 錬金器具の場合はtrue; ----------------------------------------------------------Bool Function isAlchemyLab(ObjectReference obrfTarget) global ;------------------------------------------------------- ; Init Variables ;------------------------------------------------------- Bool isObject = false; Form frmTarget = obrfTarget.GetBaseObject(); ;------------------------------------------------------- ; Check the name in the name list ;------------------------------------------------------- ; isAlchemy [KYWD 0002A40B] ; WICraftingAlchemy [KYWD 0004F6E6] If frmTarget.HasKeywordString("isAlchemy") \ || frmTarget.HasKeywordString("WICraftingAlchemy") isObject = true; Endif; frmTarget.HasKeywordString("isAlchemy") || ... ;------------------------------------------------------- ; Return ;------------------------------------------------------- return isObject;EndFunction; isAlchemyLab() ; ----------------------------------------------------------; @name isCookingObject; @desc 対象のオブジェクトが調理器具かどうか; @function; @global; @param obrfTarget {ObjectReference} 対象のオブジェクト; @returns {Bool}; 調理器具の場合はtrue; ----------------------------------------------------------Bool Function isCookingObject(ObjectReference obrfTarget) global ;------------------------------------------------------- ; Init Variables ;------------------------------------------------------- Bool isObject = false; Form frmTarget = obrfTarget.GetBaseObject(); ;------------------------------------------------------- ; Check the name in the name list ;------------------------------------------------------- ; isCookingSpit [KYWD 00068ADA] ; CraftingCookpot [KYWD 000A5CB3] ; isSmallCookingPot [KYWD 001010B2] ; isSmallCookingPotDBPoison [KYWD 001010B5] ; isCraftingOven [KYWD 01002840] If frmTarget.HasKeywordString("isCookingSpit") \ || frmTarget.HasKeywordString("isCraftingOven") \ || frmTarget.HasKeywordString("CraftingCookpot") \ || frmTarget.HasKeywordString("isSmallCookingPot") \ || frmTarget.HasKeywordString("isSmallCookingPotDBPoison") isObject = true; Endif; frmTarget.HasKeywordString("isCookingSpit") || ... ;------------------------------------------------------- ; Return ;------------------------------------------------------- return isObject;EndFunction; isCookingObject() ; ----------------------------------------------------------; @name isEnchanter; @desc 対象のオブジェクトが通常の付呪器具かどうか; @function; @global; @param obrfTarget {ObjectReference} 対象のオブジェクト; @returns {Bool}; 通常の付呪器具の場合はtrue; ----------------------------------------------------------Bool Function isEnchanter(ObjectReference obrfTarget) global ;------------------------------------------------------- ; Init Variables ;------------------------------------------------------- Bool isObject = false; Form frmTarget = obrfTarget.GetBaseObject(); ;------------------------------------------------------- ; Check the name in the name list ;------------------------------------------------------- ; isEnchanting [KYWD 0006E2A3] ; WICraftingEnchanting [KYWD 0004F6DD] ; DLC2StaffEnchanter [KYWD 02017738] If frmTarget.HasKeywordString("DLC2StaffEnchanter") isObject = false; Elseif frmTarget.HasKeywordString("isEnchanting") \ || frmTarget.HasKeywordString("WICraftingEnchanting") isObject = true; Endif; frmTarget.HasKeywordString("DLC2StaffEnchanter") ;------------------------------------------------------- ; Return ;------------------------------------------------------- return isObject;EndFunction; isEnchanter() ; ----------------------------------------------------------; @name isStaffEnchanter; @desc 対象のオブジェクトが杖の付呪器具かどうか; @function; @global; @param obrfTarget {ObjectReference} 対象のオブジェクト; @returns {Bool}; 杖の付呪器具の場合はtrue; ----------------------------------------------------------Bool Function isStaffEnchanter(ObjectReference obrfTarget) global ;------------------------------------------------------- ; Init Variables ;------------------------------------------------------- Bool isObject = false; Form frmTarget = obrfTarget.GetBaseObject(); ;------------------------------------------------------- ; Check the name in the name list ;------------------------------------------------------- ; DLC2StaffEnchanter [KYWD 02017738] If frmTarget.HasKeywordString("DLC2StaffEnchanter") isObject = true; Endif; frmTarget.HasKeywordString("DLC2StaffEnchanter") ;------------------------------------------------------- ; Return ;------------------------------------------------------- return isObject;EndFunction; isStaffEnchanter() ; ----------------------------------------------------------; @name isSharpeningWheel; @desc 対象のオブジェクトが研ぎ石かどうか; @function; @global; @param obrfTarget {ObjectReference} 対象のオブジェクト; @returns {Bool}; 研ぎ石の場合はtrue; ----------------------------------------------------------Bool Function isSharpeningWheel(ObjectReference obrfTarget) global ;------------------------------------------------------- ; Init Variables ;------------------------------------------------------- Bool isObject = false; Form frmTarget = obrfTarget.GetBaseObject(); ;------------------------------------------------------- ; Check the name in the name list ;------------------------------------------------------- ; WICraftingSmithingTempering [KYWD 0004F6FD] ; CraftingSmithingSharpeningWheel [KYWD 00088108] If frmTarget.HasKeywordString("WICraftingSmithingTempering") \ || frmTarget.HasKeywordString("CraftingSmithingSharpeningWheel") isObject = true; Endif; frmTarget.HasKeywordString("WICraftingSmithingTempering") || ... ;------------------------------------------------------- ; Return ;------------------------------------------------------- return isObject;EndFunction; isSharpeningWheel() ; ----------------------------------------------------------; @name isArmorTable; @desc 対象のオブジェクトが作業机かどうか; @function; @global; @param obrfTarget {ObjectReference} 対象のオブジェクト; @returns {Bool}; 作業机の場合はtrue; ----------------------------------------------------------Bool Function isArmorTable(ObjectReference obrfTarget) global ;------------------------------------------------------- ; Init Variables ;------------------------------------------------------- Bool isObject = false; Form frmTarget = obrfTarget.GetBaseObject(); ;------------------------------------------------------- ; Check the name in the name list ;------------------------------------------------------- ; isBlacksmithWorkbench [KYWD 000D932E] ; CraftingSmithingArmorTable [KYWD 000ADB78] If frmTarget.HasKeywordString("isBlacksmithWorkbench") \ || frmTarget.HasKeywordString("CraftingSmithingArmorTable") isObject = true; Endif; frmTarget.HasKeywordString("isBlacksmithWorkbench") || ... ;------------------------------------------------------- ; Return ;------------------------------------------------------- return isObject;EndFunction; isArmorTable() ; ----------------------------------------------------------; @name isForge; @desc 対象のオブジェクトが鍛造器具かどうか; @function; @global; @param obrfTarget {ObjectReference} 対象のオブジェクト; @returns {Bool}; 鍛造器具の場合はtrue; ----------------------------------------------------------Bool Function isForge(ObjectReference obrfTarget) global ;------------------------------------------------------- ; Init Variables ;------------------------------------------------------- Bool isObject = false; Form frmTarget = obrfTarget.GetBaseObject(); ;------------------------------------------------------- ; Check the name in the name list ;------------------------------------------------------- ; isBlacksmithForge [KYWD 000CAE0A] ; CraftingSmithingForge [KYWD 00088105] ; isBlacksmithAnvil [KYWD 000EB60B] If frmTarget.HasKeywordString("isBlacksmithForge") \ || frmTarget.HasKeywordString("isBlacksmithAnvil") \ || frmTarget.HasKeywordString("CraftingSmithingForge") isObject = true; Endif; frmTarget.HasKeywordString("isBlacksmithForge") || ... ;------------------------------------------------------- ; Return ;------------------------------------------------------- return isObject;EndFunction; isForge() ; ----------------------------------------------------------; @name isTanningRack; @desc 対象のオブジェクトが皮なめしかどうか; @function; @global; @param obrfTarget {ObjectReference} 対象のオブジェクト; @returns {Bool}; 皮なめしの場合はtrue; ----------------------------------------------------------Bool Function isTanningRack(ObjectReference obrfTarget) global ;------------------------------------------------------- ; Init Variables ;------------------------------------------------------- Bool isObject = false; Form frmTarget = obrfTarget.GetBaseObject(); ;------------------------------------------------------- ; Check the name in the name list ;------------------------------------------------------- ; isTanning [KYWD 000727A0] ; CraftingTanningRack [KYWD 0007866A] If frmTarget.HasKeywordString("isTanning") \ || frmTarget.HasKeywordString("CraftingTanningRack") isObject = true; Endif; frmTarget.HasKeywordString("isTanning") || ... ;------------------------------------------------------- ; Return ;------------------------------------------------------- return isObject;EndFunction; isTanningRack() ; ----------------------------------------------------------; @name isSmelter; @desc 対象のオブジェクトが溶鉱炉かどうか; @function; @global; @param obrfTarget {ObjectReference} 対象のオブジェクト; @returns {Bool}; 溶鉱炉の場合はtrue; ----------------------------------------------------------Bool Function isSmelter(ObjectReference obrfTarget) global ;------------------------------------------------------- ; Init Variables ;------------------------------------------------------- Bool isObject = false; Form frmTarget = obrfTarget.GetBaseObject(); ;------------------------------------------------------- ; Check the name in the name list ;------------------------------------------------------- ; isSmelter [KYWD 0009C6C3] ; CraftingSmelter [KYWD 000A5CCE] If frmTarget.HasKeywordString("isSmelter") \ || frmTarget.HasKeywordString("CraftingSmelter") isObject = true; Endif; frmTarget.HasKeywordString("isSmelter") || ... ;------------------------------------------------------- ; Return ;------------------------------------------------------- return isObject;EndFunction; isSmelter() ; ----------------------------------------------------------; @name isWoodChoppingBlock; @desc 対象のオブジェクトが薪割りかどうか; @function; @global; @param obrfTarget {ObjectReference} 対象のオブジェクト; @returns {Bool}; 薪割りの場合はtrue; ----------------------------------------------------------Bool Function isWoodChoppingBlock(ObjectReference obrfTarget) global ;------------------------------------------------------- ; Init Variables ;------------------------------------------------------- Bool isObject = false; Form frmTarget = obrfTarget.GetBaseObject(); ;------------------------------------------------------- ; Check the name in the name list ;------------------------------------------------------- ; FurnitureWoodChoppingBlock / 0x00072dfb (KYWD) If frmTarget.HasKeywordString("FurnitureWoodChoppingBlock") isObject = true; Endif; frmTarget.HasKeywordString("FurnitureWoodChoppingBlock") ;------------------------------------------------------- ; Return ;------------------------------------------------------- return isObject;EndFunction; isWoodChoppingBlock() ; ----------------------------------------------------------; @name isOreVein; @desc 対象のオブジェクトが鉱脈かどうか; @function; @global; @param obrfTarget {ObjectReference} 対象のオブジェクト; @returns {Bool}; 鉱脈の場合はtrue; ----------------------------------------------------------Bool Function isOreVein(ObjectReference obrfTarget) global ;------------------------------------------------------- ; Init Variables ;------------------------------------------------------- Bool isObject = false; Form frmTarget = obrfTarget.GetBaseObject(); ;------------------------------------------------------- ; Check the name in the name list ;------------------------------------------------------- ; isPickaxeFloor [KYWD 000613A8] ; isPickaxeTable [KYWD 000613A9] ; isPickaxeWall [KYWD 000A82C3] If frmTarget.HasKeywordString("isPickaxeFloor") \ || frmTarget.HasKeywordString("isPickaxeTable") \ || frmTarget.HasKeywordString("isPickaxeWall") isObject = true; Endif; frmTarget.HasKeywordString("isPickaxeFloor") || ... ;------------------------------------------------------- ; Return ;------------------------------------------------------- return isObject;EndFunction; isOreVein() 盗み判定 盗みかどうかを判定する関数はない為、不法侵入と所有権で判定している。 Bool Function isStealing(ObjectReference obrfTarget, Actor actTarget) ;------------------------------------------------------- ; Declare Variables ;------------------------------------------------------- Bool isStealing; ActorBase abTarget; Cell celThis; ActorBase abOwnThis; Faction fctOwnThis; ActorBase abOwnHere; Faction fctOwnHere; ;------------------------------------------------------- ; Init Variables ;------------------------------------------------------- isStealing = actTarget.IsTrespassing(); abTarget = actTarget.GetActorBase(); celThis = obrfTarget.GetParentCell(); abOwnThis = obrfTarget.GetActorOwner(); fctOwnThis = obrfTarget.GetFactionOwner(); abOwnHere = celThis.GetActorOwner(); fctOwnHere = celThis.GetFactionOwner(); ;------------------------------------------------------- ; Check Stealing ;------------------------------------------------------- If abOwnThis (abOwnThis != abTarget) isStealing = true; Elseif abOwnHere (abOwnHere != abTarget) isStealing = true; Elseif fctOwnThis !actTarget.IsInFaction(fctOwnThis) isStealing = true; Elseif fctOwnHere !actTarget.IsInFaction(fctOwnHere) isStealing = true; Endif; abOwnThis (abOwnThis != abTarget) ;------------------------------------------------------- ; Return ;------------------------------------------------------- return true;EndFunction; isStealing() 配置オブジェクトの操作 セル内に配置されたオブジェクトを操作する処理。 配置オブジェクトを一括で初期位置に戻す MoveToMyEditorLocation()が初期位置に戻す処理。 この例では、nObjectTypeでオブジェクトの種類を指定して、セル内のオブジェクトを一括で元の位置に戻している。 ; ----------------------------------------------------------; @name resetPositionsByObjectTypeIn; @function; @global; @param [celTarget=None] {Cell}; @param [nObjectType=0] {Int}; @returns {Int}; ----------------------------------------------------------Int Function resetPositionsByObjectTypeIn( \ Cell celTarget = None, \ Int nObjectType = 0 \) global ;------------------------------------------------------- ; Init Variables ;------------------------------------------------------- ObjectReference obrfEach; Int nIdx; Int nCnt; Int nReset = 0; ;------------------------------------------------------- ; Check the target cell ;------------------------------------------------------- If !celTarget celTarget = Game.GetPlayer().GetParentCell(); Endif; !celTarget ;------------------------------------------------------- ; Loop of objects ;------------------------------------------------------- nIdx = 0; nCnt = celTarget.GetNumRefs(nObjectType); While (nIdx nCnt) obrfEach = celTarget.GetNthRef(nIdx, nObjectType); If obrfEach obrfEach.MoveToMyEditorLocation(); nReset += 1; Endif; obrfEach nIdx += 1; EndWhile; (nIdx nCnt) ;------------------------------------------------------- ; Return ;------------------------------------------------------- return nReset;EndFunction; resetPositionsByObjectTypeIn() 配置オブジェクトを一括で固定化する SetMotionType()でMotion_Keyframedを指定すると、オブジェクトが固定化されて動かなくなる。 つまり、体当たりしても動かないオブジェクトになる。 この例では、nObjectTypeでオブジェクトの種類を指定して、セル内のオブジェクトを一括で固定化したり、固定化を解除したりしている。 ; ----------------------------------------------------------; @name setMotionTypeByObjectTypeIn; @function; @global; @param [celTarget=None] {Cell}; @param [enableLock=true] {Bool}; @param [nObjectType=0] {Int}; @returns {Int}; ----------------------------------------------------------Int Function setMotionTypeByObjectTypeIn( \ Cell celTarget = None, \ Bool enableLock = true, \ Int nObjectType = 0 \) global ;------------------------------------------------------- ; Init Variables ;------------------------------------------------------- ObjectReference obrfEach; Int nIdx; Int nCnt; Int nLockCnt = 0; ;------------------------------------------------------- ; Check the target cell ;------------------------------------------------------- If !celTarget celTarget = Game.GetPlayer().GetParentCell(); Endif ;------------------------------------------------------- ; Loop of objects ;------------------------------------------------------- nIdx = 0; nCnt = celTarget.GetNumRefs(nObjectType); While (nIdx nCnt) obrfEach = celTarget.GetNthRef(nIdx, nObjectType); ; Motion_Dynamic = 1 ; Motion_SphereIntertia = 2 ; Motion_BoxIntertia = 3 ; Motion_Keyframed = 4 ; Motion_Fixed = 5 ; Motion_ThinBoxIntertia = 6 ; Motion_Character = 7 If obrfEach.GetMass() enableLock obrfEach.SetMotionType(obrfEach.Motion_Keyframed); nLockCnt += 1; Elseif !enableLock obrfEach.SetMotionType(obrfEach.Motion_Dynamic); nLockCnt += 1; Endif nIdx += 1; EndWhile ;------------------------------------------------------- ; Return ;------------------------------------------------------- return nLockCnt;EndFunction; setMotionTypeByObjectTypeIn() 配置オブジェクトを一括で収集する 死体は単純にMoveTo()では移動できないので、Disable()してMoveTo()してEnable()している。 ; ----------------------------------------------------------; @name gatherObjectsIn; @function; @global; @param [celTarget=None] {Cell}; @param [obrfMoveTo=None] {ObjectReference}; @param [nType=0] {Int}; Form-Type; @param [nIsDeadAlive=0] {Int}; 0 = both, 1 = lives only, -1 = deads only; @returns {Bool}; ----------------------------------------------------------Bool Function gatherObjectsIn( \ Cell celTarget = None, \ ObjectReference obrfMoveTo = None, \ Int nType = 0, \ Int nIsDeadAlive = 0 \) global ;------------------------------------------------------- ; Init Variables ;------------------------------------------------------- Int nIdx; Int nCnt; ObjectReference obrfEach; Actor actEach; ;------------------------------------------------------- ; Check arguments ;------------------------------------------------------- If !obrfMoveTo obrfMoveTo = Game.GetPlayer() as ObjectReference; Endif If !celTarget celTarget = obrfMoveTo.GetParentCell(); Endif ;------------------------------------------------------- ; Scan chests ;------------------------------------------------------- nIdx = 0; nCnt = celTarget.GetNumRefs(nType); While (nIdx nCnt) obrfEach = celTarget.GetNthRef(nIdx, nType); If !obrfEach.IsEnabled() || obrfEach.IsDeleted() obrfEach = None; Endif If obrfEach (nType == 43) actEach = obrfEach as Actor; Else actEach = None; Endif If actEach If (nIsDeadAlive 0) actEach.IsDead() obrfEach = None; actEach = None; Elseif (nIsDeadAlive 0) !actEach.IsDead() obrfEach = None; actEach = None; Endif Endif If actEach (nType == 43) If actEach.IsDead() actEach.Disable(); Endif; actEach.IsDead() actEach.MoveTo(obrfMoveTo); If actEach.IsDead() actEach.Enable(); Endif; actEach.IsDead() Elseif !actEach obrfEach obrfEach.MoveTo(obrfMoveTo); Endif nIdx += 1; EndWhile ;------------------------------------------------------- ; Return ;------------------------------------------------------- return true;EndFunction; gatherObjectsIn() 配置オブジェクトを一括で検知する 変性呪文の検知魔法のようなもの。スクリプトで実装すれば、好きなエフェクトを設定できる。 ; ----------------------------------------------------------; @name detectObjectsIn; @function; @global; @param [celTarget=None] {Cell}; @param [nType=0] {Int}; Form-Type; @param [isLootableOnly=false] {Bool}; @param [nIsDeadAlive=0] {Int}; 0 = both, 1 = lives only, -1 = deads only; @returns {Bool}; ----------------------------------------------------------Bool Function detectObjectsIn( \ Cell celTarget = None, \ Int nType = 0, \ Bool isLootableOnly = false, \ Int nIsDeadAlive = 0 \) global ;------------------------------------------------------- ; Init Variables ;------------------------------------------------------- Int nIdx; Int nCnt; ObjectReference obrfEach; Actor actEach; Actor actPlayer = Game.GetPlayer(); EffectShader efsEnemy; EffectShader efsAlly; Hazard hzdDetect; Bool isLootable; ;------------------------------------------------------- ; Get Effect ;------------------------------------------------------- ; LifeDetected [EFSH 0x000146] ; LifeDetectedEnemy [EFSH 0x0DC209] ; LifeDetectedUndead [EFSH 0x0AAEB3] ; LifeDetectedUndeadEnemy [EFSH 0x016439] ; KynesPeaceFXS [EFSH 0x084B39] ; HealCircleFXS [EFSH 0x10CDC9] ; WerewolfTransFXS [EFSH 0x0EBEC5] ; WerewolfTrans02FXS [EFSH 0x0EBECD] ; DragonPowerAbsorbFXS [EFSH 0x0280C0] ; AbsorbBlueFXS [EFSH 0x0ABF08] ; AbsorbGreenFXS [EFSH 0x0ABF07] ; AbsorbHealthFXS [EFSH 0x0ABEFF] efsAlly = Game.GetForm(0x000146) as EffectShader; efsEnemy = Game.GetForm(0x0DC209) as EffectShader; ; CircleOfProtectionHazard [HAZD 0x04E80C] ; CircleVitalityHazard [HAZD 0x0B62EA] ; GuardianCircleHazard [HAZD 0x0E0CD3] ; GuardianCircleTurnHazard [HAZD 0x0FEAD3] hzdDetect = Game.GetForm(0x04E80C) as Hazard; ;------------------------------------------------------- ; Check the target cell ;------------------------------------------------------- If !celTarget celTarget = Game.GetPlayer().GetParentCell(); Endif ;------------------------------------------------------- ; Scan chests ;------------------------------------------------------- nIdx = 0; nCnt = celTarget.GetNumRefs(nType); While (nIdx nCnt) obrfEach = celTarget.GetNthRef(nIdx, nType); If !obrfEach.IsEnabled() || obrfEach.IsDeleted() obrfEach = None; Endif If obrfEach (nType == 43) actEach = obrfEach as Actor; Else actEach = None; Endif If actEach If (nIsDeadAlive 0) actEach.IsDead() obrfEach = None; actEach = None; Elseif (nIsDeadAlive 0) !actEach.IsDead() obrfEach = None; actEach = None; Endif Endif If !isLootableOnly isLootable = false; Elseif actEach isLootable = (actEach.GetNumItems() 1); Elseif obrfEach (nType == 28) isLootable = (obrfEach.GetNumItems() 0); Else isLootable = false; Endif If isLootableOnly !isLootable obrfEach = None; actEach = None; Endif If actEach (nType == 43) If isEnemy(actEach) efsEnemy.Play(actEach, 26.0); Else efsAlly.Play(actEach, 26.0); Endif; isEnemy(actEach) Elseif !actEach obrfEach obrfEach.placeAtMe(hzdDetect); Endif nIdx += 1; EndWhile ;------------------------------------------------------- ; Return ;------------------------------------------------------- return true;EndFunction; detectObjectsIn() NPCを操作する NPCをPCのように操作する為に必要な一連の処理。 PCの操作停止、NPCの操作、カメラの切替、など。 Bool Function startNpcControl(Actor actTarget) ;------------------------------------------------------- ; Init Variables ;------------------------------------------------------- ;------------------------------------------------------- ; Start controlling ;------------------------------------------------------- Game.DisablePlayerControls( \ abMovement = false, \ abFighting = true, \ abCamSwitch = false, \ abLooking = false, \ abSneaking = false, \ abMenu = true, \ abActivate = false, \ abJournalTabs = false, \ aiDisablePOVType = 0 ); actTarget.SetPlayerControls(true); Game.SetPlayerAIDriven(true); actTarget.EnableAI(); Game.SetCameraTarget(actTarget); Game.ForceThirdPerson(); ;------------------------------------------------------- ; Return ;------------------------------------------------------- Return true;EndFunction; startNpcControl() Bool Function stopNpcControl(Actor actTarget) ;------------------------------------------------------- ; Init Variables ;------------------------------------------------------- Actor actPlayer = Game.GetPlayer(); ;------------------------------------------------------- ; Switch the controlling ;------------------------------------------------------- actTarget.SetPlayerControls(false); Game.SetPlayerAIDriven(false); Game.EnablePlayerControls(); actTarget.EnableAI(); Game.SetCameraTarget(actPlayer); ;------------------------------------------------------- ; Return ;------------------------------------------------------- Return true;EndFunction; stopNpcControl() マップ・マーカーを表示する 指定したクエストのエイリアスに任意のリファレンスをマーカーとして表示する。 クエストは名前でも指定可能。エイリアスは名前やIDや番号でも指定可能。 例では、isActiveで表示と非表示を切り替える。 ; ----------------------------------------------------------; @name showMapMarker; @function; @global; @param obrfTarget {ObjectReference}; @param [isActive=true] {Bool}; @param [szQuestName=] {String}; @param [nObjective=1] {Int}; @param [szAliasName=RefAlias001] {String}; @param [qstMarker=None] {Quest}; @param [ralsMarker=None] {ReferenceAlias}; @param [nAliasIdx=-1] {Int}; @param [nAliasID=-1] {Int}; @returns {Bool}; ----------------------------------------------------------Bool Function showMapMarker( \ ObjectReference obrfTarget, \ Bool isActive = true, \ String szQuestName = "", \ Int nObjective = 1, \ String szAliasName = "RefAlias001", \ Quest qstMarker = None, \ ReferenceAlias ralsMarker = None, \ Int nAliasIdx = -1, \ Int nAliasID = -1 \) global ;------------------------------------------------------- ; Init Variables ;------------------------------------------------------- Bool isOK = false; ;------------------------------------------------------- ; Check Arguments ;------------------------------------------------------- If !obrfTarget return isOK; Endif ;------------------------------------------------------- ; Get Marker Quest ;------------------------------------------------------- If !qstMarker qstMarker = Quest.GetQuest(szQuestName); Endif If !qstMarker return isOK; Endif ;------------------------------------------------------- ; Get Reference Alias ;------------------------------------------------------- If !ralsMarker (nAliasIdx = 0) ralsMarker = \ qstMarker.GetNthAlias( \ nAliasIdx ) as ReferenceAlias; Elseif !ralsMarker (nAliasID = 0) ralsMarker = \ qstMarker.GetAliasById( \ nAliasID ) as ReferenceAlias; Elseif !ralsMarker (szAliasName != "") ralsMarker = \ qstMarker.GetAliasByName( \ szAliasName ) as ReferenceAlias; Endif If !ralsMarker return isOK; Endif ;------------------------------------------------------- ; Show Marker ;------------------------------------------------------- If isActive ralsMarker.ForceRefTo(obrfTarget); qstMarker.SetObjectiveDisplayed( \ nObjective, true, false ); isOK = true; Else ralsMarker.Clear(); qstMarker.SetObjectiveDisplayed( \ nObjective, false, false ); isOK = true; Endif ;------------------------------------------------------- ; Return ;------------------------------------------------------- return isOK;EndFunction; showMapMarker() 対象の人の戦闘を強制停止させる 戦闘を停止させる処理の詰め合わせ。 StopCombat()は対象のアクターの戦闘状態を停止させることしか出来ない。 本格的に戦闘停止させるには、警戒状態も解除し、相手方の戦闘状態も解除する必要がある。 disableRecoverのオプションは、戦闘停止時に全回復するようなMOD対策。 戦闘停止後に、停止前の体力に強制的に戻す為のオプション。 ; ----------------------------------------------------------; @name stopCombatEx; @function; @global; @param actTarget {Actor}; @param [disableRecover=true] {Bool}; @param [enableStopAlarm=false] {Bool}; @param [enableStopTarget=false] {Bool}; @returns {Bool}; ----------------------------------------------------------Bool Function stopCombatEx( \ Actor actTarget, \ Bool disableRecover = true, \ Bool enableStopAlarm = false, \ Bool enableStopTarget = false \) global ;------------------------------------------------------- ; Init Variables ;------------------------------------------------------- Float nHealth; Float nDamage; Actor actEnemy; ;------------------------------------------------------- ; Check Arguments ;------------------------------------------------------- If !actTarget || !actTarget.IsInCombat() return false; Endif; !actTarget || !actTarget.IsInCombat() ;------------------------------------------------------- ; Get Current Health ;------------------------------------------------------- If disableRecover nHealth = actTarget.GetActorValue("Health"); Endif; disableRecover ;------------------------------------------------------- ; Stop Combat (Self) ;------------------------------------------------------- actTarget.StopCombat(); ;------------------------------------------------------- ; Stop Alarm ;------------------------------------------------------- If enableStopAlarm actTarget.StopCombatAlarm(); Endif; enableStopAlarm ;------------------------------------------------------- ; Stop Combat (Enemy) ;------------------------------------------------------- If enableStopTarget actEnemy = actTarget.GetCombatTarget(); If actEnemy stopCombatEx(actEnemy, disableRecover, false, false); Endif Endif; enableStopTarget ;------------------------------------------------------- ; Damage Health ;------------------------------------------------------- If disableRecover nDamage = actTarget.GetActorValue("Health") - nHealth; If (nDamage 0.0) actTarget.DamageActorValue("Health", nDamage); Endif; (nDamage 0.0) Endif; disableRecover ;------------------------------------------------------- ; Return ;------------------------------------------------------- return true;EndFunction; stopCombatEx() 外見変更 顔テキスチャの変更 NetImmerse Overrideが必要。 アクターの顔テキスチャを変更する処理。顔用のTextureSetを指定する。 ; ----------------------------------------------------------; @name changeFace; @function; @global; @param actTarget {Actor}; @param txtSkin {TextureSet}; @returns {Bool}; ----------------------------------------------------------Bool Function changeFace(Actor actTarget, TextureSet txtSkin) global ;------------------------------------------------------- ; Init Variables ;------------------------------------------------------- ActorBase abTarget; Int nHeadIdx = -1; String szNode = ""; ;------------------------------------------------------- ; Check Arguments ;------------------------------------------------------- If !actTarget || !txtSkin return false; Else abTarget = actTarget.GetLeveledActorBase(); Endif; !actTarget || !txtSkin ;------------------------------------------------------- ; Get Head Index ;------------------------------------------------------- If abTarget nHeadIdx = abTarget.GetIndexOfHeadPartByType(1); Endif; abTarget ;------------------------------------------------------- ; Get Node Name ;------------------------------------------------------- If (nHeadIdx = 0) szNode = abTarget.GetNthHeadPart(nHeadIdx).GetName(); Endif; (nHeadIdx = 0) ;------------------------------------------------------- ; Apply Face Texture ;------------------------------------------------------- If (nHeadIdx = 0) abTarget.SetFaceTextureSet(txtSkin); NetImmerse.SetNodeTextureSet( \ actTarget, szNode, txtSkin, false); Endif; (nHeadIdx = 0) ;------------------------------------------------------- ; Return ;------------------------------------------------------- return true;EndFunction; changeFace() 髪パーツの変更 ; ----------------------------------------------------------; @name changeHair; @function; @global; @param actTarget {Actor}; @param hpNewHair {HeadPart}; @returns {Bool}; ----------------------------------------------------------Bool Function changeHair(Actor actTarget, HeadPart hpNewHair) ;------------------------------------------------------- ; Init Variables ;------------------------------------------------------- ActorBase abTarget = actTarget.GetLeveledActorBase(); Bool isPlayer = (Game.GetPlayer() == actTarget); Int nHeadIdx; HeadPart hpCurHair; ;------------------------------------------------------- ; Get Hair Headparts ;------------------------------------------------------- nHeadIdx = abTarget.GetIndexOfHeadPartByType(3); hpCurHair = abTarget.GetNthHeadPart(nHeadIdx); ;------------------------------------------------------- ; Reset Hair Part ;------------------------------------------------------- If !isPlayer hpNewHair actTarget.ReplaceHeadPart(hpCurHair, hpNewHair); Elseif isPlayer hpNewHair actTarget.ChangeHeadPart(hpNewHair); Endif; !isPlayer hpNewHair ;------------------------------------------------------- ; Return ;------------------------------------------------------- return true;EndFunction; changeHair() プレイヤーのヘッド・トラッキング 指定したオブジェクトに対して、プレイヤーにヘッド・トラッキングさせる処理。 自分自身を対象に指定すると、ゆっくり正面を向く。(ヘッド・トラッキングは継続) ヘッド・トラッキングそのものを停止すると、急に正面を向く。 Bool Function startPlayerHeadTracking(ObjectReference obrfTarget) ;------------------------------------------------------- ; Declare Variables ;------------------------------------------------------- Actor actPlayer = Game.GetPlayer(); ;------------------------------------------------------- ; Player Head Tracking ;------------------------------------------------------- If obrfTarget actPlayer.SetHeadTracking(true); actPlayer.SetLookAt(obrfTarget, false); actPlayer.SetAnimationVariableBool("bHeadTrackSpine", false); actPlayer.SetAnimationVariableInt("IsNPC", 1); Endif; obrfTarget ;------------------------------------------------------- ; Return ;------------------------------------------------------- return true;EndFunction; startPlayerHeadTracking() Bool Function stopPlayerLooking() ;------------------------------------------------------- ; Declare Variables ;------------------------------------------------------- Actor actPlayer = Game.GetPlayer(); ;------------------------------------------------------- ; Player Head Tracking ;------------------------------------------------------- actPlayer.SetLookAt(actPlayer, false); ;------------------------------------------------------- ; Return ;------------------------------------------------------- return true;EndFunction; stopPlayerLooking() Bool Function stopPlayerHeadTracking() ;------------------------------------------------------- ; Declare Variables ;------------------------------------------------------- Actor actPlayer = Game.GetPlayer(); ;------------------------------------------------------- ; Player Head Tracking ;------------------------------------------------------- actPlayer.ClearLookAt(); actPlayer.SetAnimationVariableBool( \ "bHeadTrackSpine", false ); actPlayer.SetAnimationVariableInt("IsNPC", 0); actPlayer.SetHeadTracking(false); ;------------------------------------------------------- ; Return ;------------------------------------------------------- return true;EndFunction; stopPlayerHeadTracking() 配列の要素数を128を超えたものを扱いたい、または動的に配列を宣言したい Papyrusの配列は通常は1~128までの範囲しか扱う事ができず、 それ以上の配列数を宣言しようと128を超える数値を指定するとエラーが発生します。 また、配列宣言時に配列数の部分を変数で指定した場合もエラーが発生します。 NGパターン Actor[] NPCArrayint[] ValArrayFunction Test() int num = 0 NPCArray = new Actor[200] ;1~128までの範囲で宣言しろとエラーが出る ; 変数の値分の配列を宣言したいが ; 配列数の指定に変数を指定するなとエラーが出る num = 200 ValArray = new int[num]EndFunction; Test() 配列数が128を超える配列を作成したい場合、 Float、Int、String、Form、Alias型の場合は SKSEのPapyrus拡張関数である Utility.Create~Arrayを 用いる事で配列数が128を超える配列を作成することができます。(~の部分は型によって異なりますのでスクリプトリファレンスを確認してください。) https //www.creationkit.com/index.php?title=Utility_Script Actor型の場合は標準のSKSEの拡張関数には存在しないため Papyrus拡張SKSEプラグインであるPapyrusUtilが必要となります。 この方法で配列の宣言をする場合、処理に必要な配列数を動的に宣言できるようになる他に第2引数に値を指定する事で宣言と同時に各要素の値を指定値で初期化する事ができます。 実装例 Actor[] NPCArrayint[] ValArrayFunction Test() int num = 200 ; NPCArray = PapyrusUtil.ActorArray(num, None) ValArray = Utility.CreateIntArray(num, 10) ; 配列の各要素の値を10で初期化EndFunction; Test() 装備してる武器や防具に付いているエンチャントを取得する(自分で付呪したものも取得する方法) 装備してる武器、防具のエンチャントを取得する処理。 WeaponとArmorのGetEnchantment関数は自分から付呪を施したエンチャントを取得できないため、 WornObject.GetEnchantment関数でのチェックも行う。 ; 装備してる武器のエンチャントを取得; iRightHandに0を渡せば左手武器のエンチャントを取得Enchantment Function GetWeaponEnchantment(Actor akTarget, int iRightHand = 1)Weapon w = akTarget.GetEquippedObject(iRightHand) as Weaponif !wreturn Noneendif Enchantment ench = w.GetEnchantment()if enchreturn enchendif return WornObject.GetEnchantment(akTarget, iRightHand, 0)EndFunction ; 装備してる防具のエンチャントを取得Enchantment Function GetArmorEnchantment(Actor akTarget, int iSlotMask)Armor arm = akTarget.GetWornForm(iSlotMask) as Armorif !armreturn Noneendif Enchantment ench = arm.GetEnchantment()if enchreturn enchendif return WornObject.GetEnchantment(akTarget, 0, iSlotMask)EndFunction 上記サンプルのGetArmorEnchantment関数で第ニ引数に渡す値はスロットマスクとなります。 スロットマスクの値はこちらのページを参照してください。 最初からエンチャントが付いてる装備については上記のようにGetEquippedObjectやGetWornForm等でアイテムを取得し それに対してGetEnchantment関数を使用すれば取得可能です。 ただし、GetEquippedObject等で取得できる武器と防具のデータはベースフォームであり、 自分から付呪を行った武器や防具に対してGetEnchantment関数を使用した場合はNoneを返します。 自分から付呪を行った武器や防具のエンチャントを取得したい場合は WornObjectオブジェクトのGetEnchantment関数を使用すれば取得できます。 ただし、WornObjectオブジェクトのGetEnchantment関数は 対象の装備に自分で付呪したエンチャントがある場合のみ、エンチャントを返すという仕様のため 逆に最初からエンチャントが付いてる装備の場合はNoneを返します。 そのため、現在装備しているアイテムのエンチャントを取得する場合は サンプルのように最初から付呪がされてるアイテムであるか確認し、 そうでない場合、WornObjectオブジェクトのGetEnchantment関数で自前で作成した付呪を取得するようにしましょう。 MCMの設定を保存、ゲーム開始時や再開時に設定を自動読込する 外部ファイルにMCMの設定を保存する事でニューゲーム時や違うセーブデータでゲームを再開した時に 一々MCMの再設定をする手間を省かせるようにする。 現状でメジャーなのはPapyrusUtilのJsonUtilオブジェクトを使用する方法か MCMHelper(SEのみ)を使用する方法だが、 PapyrusUtilによる方法を記載する。 注:FISSでの自動読込は禁止。仕組み上の問題で複数のスクリプトが同時にFISSを使用するとCTDとなるため。 Scriptname [スクリプト名] extends ski_configbase GlobalVariable Property SampleGV auto ~省略~ String settings_path = "..\\[Mod名]\\UserSettings" ; MCMはセーブからのロード時にOnGameReloadイベントが発生するため; この時に設定の読み込みを行うEvent OnGameReload()parent.OnGameReload()LoadUserSettingsPapyrus()endEvent ; MCMを閉じた時に実行; 設定を自動保存Event OnConfigClose()parent.OnConfigClose()SaveUserSettingsPapyrus()EndEvent ; MCMの初期化; ニューゲーム時に設定の自動読込が実行されるevent OnConfigInit();MCMの初期設定を記述~省略~ LoadUserSettingsPapyrus()endEvent Bool function SaveUserSettingsPapyrus()JsonUtil.SetPathIntValue(settings_path, "Sample", SampleGV.GetValueInt()) if !JsonUtil.Save(settings_path, false)debug.Trace(ModName + " Error saving user settings.", 0)return falseendIfreturn trueendFunction Bool function LoadUserSettingsPapyrus()if !JsonUtil.IsGood(settings_path)ShowMessage(ModName + " Can t load User Settings. Errors {" + JsonUtil.getErrors(settings_path) + "}")return falseendIf SampleGV.SetValueInt(JsonUtil.GetPathIntValue(settings_path, "Sample", SampleGV.GetValueInt()))return trueendFunction ~OnConfigOpen等のMCMの各イベントの処理の記述は省略~ MCMを開いて後に閉じた後に (ルートディレクトリ)\SKSE\Plugins\[Mod名]ディレクトリにUserSettings.jsonが生成されている事、 セーブからのロードやニューゲーム時にMCMの設定が引き継がれている事を確認できたら、 MCMの自動保存と自動読込の作成は完了となります。 (MO2の場合は\overwrite\SKSE\Plugins\[Mod名]ディレクトリにUserSettings.jsonが生成されます。) 上記サンプルでUserSettings.jsonに記載される内容 {Sample [設定値(整数)]} ゲーム開始時にModの設定を一つ一つ手動でロードするのはユーザー側にとってかなり手間となるため 基本的には自動読込は実装するようにしましょう。 保存に関しては設定の切り替えが簡単だったり項目数が少なければ自動保存で問題ありませんが、 設定項目がかなりの数がある場合は自動保存はMCM側の設定で実行するか制御できるようにし、 手動保存と手動読込の手段も一緒に追加すると良いです。 余裕があれば自動保存、自動読込は設定で制御できるようにすると良いでしょう。
https://w.atwiki.jp/aniwotawiki/pages/11314.html
登録日:2009/08/04(火) 21 56 18 更新日:2024/08/28 Wed 14 05 55NEW! 所要時間:約 3 分で読めます ▽タグ一覧 BlueSky! Moonlight Labyrinth ゲーム フリーゲーム ムーンライトラビリンス 公開停止 死にゲー 読みは「ムーンライトラビリンス」 サークル「BlueSky!」が2006年に制作したRPGツクール2000用のフリーゲーム。 ジャンルはホラーアクション。 残念ながら既に公開停止されているため、入手は困難。 ※制作はリュウジ氏がほぼ一人で行いほぼ一人で完成させたため、チック氏はテストプレイ以外全く携わっておりません(重要)。 【ストーリー】 一国の王女が、古の呪いにより魔物の巣食う廃城に閉じ込められる。 彼女は無事に城から脱出できるのか。 【システム】 マルチエンディングのアクション+謎解きアドベンチャー。 主人公「リリア」を操り、罠や魔物をかわし、迷宮を脱出するのが目的。 なお、エンディングはトゥルー含めて5種。そのほとんどがムゴい。 トゥルーは是非とも見た方がいい。 操作についてはキーボードを使用。 矢印キーで移動、Xキーでメニュー画面を開く、Zキーで調べる、というようにシンプル。 【特徴】 とにかくゲームオーバーになる。 と言うのも、全てのトラップが即死であるため。 前述の通り、何の力もないお姫様が主人公の為に、敵に触れたり、罠に引っかかると即あぼん。 制作者のリュウジ氏の凄さがよく分かる。 また入った瞬間ゲームオーバー確定の部屋があったり、宝箱を調べようとしたらゲームオーバーなど、なかなか鬼畜な仕様である。 一応仲間がいたり、パラメータが設定されていたりするものの、完全にお飾り。 たれリリアは必見。 【キャラクター紹介】 リリア=ミスティーズ 主人公。 ミスティーズ王家18代目の後継者。 逝き方が多彩… バン リリアをサポートする?ミニドラゴン。 城の造りに精通している。 あまりのヘタレさから、役立たずの烙印を押される。 数多くのエンディングで殺される、ぶっちゃけ「ついでに」感覚で殺されてる気がする。 クリス=ミスティーズ リリアのお兄ちゃん。 魔法が得意(ただしMP0)。 剣の鍛錬ぐらいしか取り柄がなく、政治に興味がない上に食い意地が張っている。 リリアを助けに城に来たもの、剣を無くしているという残念な兄。攻撃力72。 いざという時はカッコいいとこを見せるが…兄様ェ… レオン=ミスティーズ 見た目は狼男。 バンたちを従えている。 思い込みが激しく、王家の証のみが人間である事の判断基準。 死に方がヒドい。 ミミ 獣人の女性。 やたらとティアを守ることに固執しているのだが理由は不明。 ティア=ミスティーズ ミスティーズ15代目王女、リリアたちの先祖にあたる。 城の中で怯え隠れていた幼女。 非常に怖がりだが、カンが良い。 拷問部屋と言えばこの子。 ルナ=ミスティーズ 紫の髪の女性。 正体は、髪飾りに魂を宿したミスティーズ2代目王女。 ガレスの正体を知っているようだが…? ガレス リリアを誘拐した人。 ある理由からミスティーズ王家を憎んでいる。 かませっぽく見えるが、言動に伴うだけの実力がある。 別名:リュウジ オワタ版という改造版も存在し、そちらは本作とは打って変わってコミカルな内容になっており、こちらもまた死にゲーである(敵が)。 追記・修正は必要に応じてお願い致します。 △メニュー 項目変更 この項目が面白かったなら……\ポチッと/ -アニヲタWiki- ▷ コメント欄 [部分編集] 名前 コメント
https://w.atwiki.jp/tokilabiay/pages/97.html
海賊ジャック 図鑑No 252 属性 光 コスト ?? 種族 ?? タイプ ?? レア度 ☆4 最大LV 50 HP(レベル最大時) 1,318 攻撃力(レベル最大時) 506 必要経験値 1,213,740 必要進化ポイント - スキル スキルLV最大 ?? 必要スキルポイント ?? ?? タップした敵に攻撃力の3倍の光属性ダメージを与える アビリティ ?? 光属性モンスターのHP10%アップ 覚醒 覚醒数 最大覚醒時HP:1,378 最大覚醒時攻撃:1,046 進化 進化前 - 進化後 - 入手方法 期間限定ラビリンス「バミューダトライアングルと失われた秘宝」で入手 その他 期間限定ラビリンス「バミューダトライアングルと失われた秘宝」 コメント
https://w.atwiki.jp/tes5/pages/86.html
最強装備の作り方 以下に記載する方法は手間がかかる分、非常に強力な装備を作成することが可能です。 ただし、あまりにも強力なためゲームの面白さを損なう危険性が高くなります。 また、生産系能力を多数習得する必要があるため、戦闘系能力の習得が後々困難になってくるのでご注意下さい。 概要 作成手順準備 第一段階:最高効果の「錬金術上昇」装備の作成 第二段階:最高効果の「付呪上昇」薬と「鍛造上昇」薬の作成 第三段階:最高効果の「鍛造上昇」装備の作成 最終段階 補足 Tips 参照鍛冶スキル一覧 付呪スキル一覧 錬金術スキル一覧 最強装備の作り方その2概要 準備 手順 概要 最高の鍛冶職人が鍛造する装備に、最高の付呪師が魔法を付与することでも十分に強力な装備を得ることができるでしょう。 しかしそこに最高の錬金術師が加わることで、ようやく最強装備を手にすることができるのです。 方法としては、錬金術で付呪上昇薬作成→付呪上昇薬を飲んで錬金上昇装備作成→錬金術でさらに強い付呪上昇薬作成→… と繰り返すことにより、効果を最大限まで高め、装備を作成する、というものです。 Ver1.3でループしないよう修正された。 作成手順 準備 必要なスキルと能力鍛冶スキルを100にして、作りたい装備の能力(例:デイドラの鍛造術)を習得する 錬金術スキルを100にして、「錬金術師」(5段階)と「慈善」を習得する 付呪スキルを100にして、「付呪師」(5段階)ほか付呪効果UPの能力を全て習得する 必要な付呪効果「錬金術上昇」の効果を持つ装備を入手し、付呪効果を解呪しておく 「鍛造上昇」の効果を持つ装備を入手し、付呪効果を解呪しておく 必要なアイテム極大の魂入り魂石を複数(極大魂石、黒魂石を多数ストックしておくのが望ましいが、アズラの星or黒き星で1回ずつ頑張ってもいい) 「錬金術上昇」付呪用の装備(頭、腕、首飾り、指) ←2セット程度必要 「鍛造上昇」付呪用の装備(鎧、腕、首飾り、指) ←1セットでOK、※「追加付呪」習得済みの場合は腕、指輪、首飾りが共用可能 必要となる薬の材料「付呪上昇」の薬のレシピ:青い蝶の羽,スノーベリー,ハグレイヴンの爪,スプリガンの樹液(いずれか2つ) 「鍛造上昇」の薬のレシピ:光るキノコ,ブリスターワート,スプリガンの樹液,サーベルキャットの牙(いずれか2つ) 最強装備用の素材、もしくは強化したい装備品 第一段階:最高効果の「錬金術上昇」装備の作成 「錬金術上昇」の装備(頭、腕、首飾り、指)を作成する 出来上がった装備を装着し、「付呪上昇」の薬を複数(30秒しか持たないので4つを推奨)作成する 手順2で作成した薬を服用し、付呪効果が強化された状態のまま再度「錬金術上昇」装備を作成する 最大値に達するまで手順2~3を行う(Ver.1.4現在、1回で最大値の29%になる) 第二段階:最高効果の「付呪上昇」薬と「鍛造上昇」薬の作成 第一段階で完成した装備を装着し、「付呪上昇」の薬を作成する 第一段階で完成した装備を装着し、「鍛造上昇」の薬を作成する 第三段階:最高効果の「鍛造上昇」装備の作成 第二段階で作成した「付呪上昇」の薬を飲み、「鍛造上昇」の装備(鎧、腕、首飾り、指)を作成する 最終段階 強化したい武器/防具を作成する 第三段階で作成した「鍛造上昇」の装備を装着し、第二段階で作成した「鍛造上昇」の薬を飲みつつ武器/防具を強化する 最後に、第二段階で作成した「付呪上昇」の薬を飲みつつ、上記で作成した装備に任意の付呪を行う 以上で最強装備の完成です。 補足 Ver.1.4現在、上記手順で作成した装備の「錬金上昇効果」及び「鍛造上昇効果」の最大値は各29% Ver.1.4現在、上記手順で作成した「付呪上昇薬」の最大値は32%、「鍛造上昇薬」の最大値は130%これらの薬は最強装備を作るときに使用するものなので、作れるだけ作っておいてもいい Ver.1.3にて、Perk「スキル付呪」の効果が「錬金術上昇」「鍛造上昇」の付呪に反映されないバグの報告があったが、Ver.1.4にてきちんと反映されるよう修正された模様 攻撃力、防御力にはそれぞれ上限が設定されているようです(数値のみ上がってゲーム内で反映されない模様?) 「付呪上昇」「鍛造上昇」の薬は30秒しか効果が持続しないので、1装備に対して1本消費する、くらいのつもりで多めに用意しておいた方がよい。また、あまりに多種類の効果を付呪しているとタイムロスが多くなるので付呪は計画的に。 Tips 防具に各種魔法上昇(消費マジカ削減)の付呪を付けると、武器に付与した付呪の消費を軽減する事が出来る例:破壊上昇で消費マジカ削減をトータル100%にすると、破壊系の付呪(火炎・冷気・雷撃・体力吸収・火炎の魂縛)が付いた武器や杖が充填無しで使えるようになる ただし、従者の装備に同様の付呪を行なっても効果がない模様 頭に二つの防具をかぶるバグを利用すれば、更に強化することが可能バグを利用して錬金上昇装備を頭一つ分(+29%)増やした場合、付呪薬は37%、鍛造薬は147%まで上がる さらにDLC”Dragonborn”導入後「アージダルの才能」及び「黒の書:血色の悪い摂生」の各スキル上昇効果を活用すれば、錬金/鍛冶装備は一部位につき36%、付呪薬は46%、鍛造薬は185%まで上がる 吸血鬼になり、回復スキルのperk『聖職者』を取得することで、更に高レベルの鍛造/付呪が可能『聖職者』は吸血鬼を含むアンデッドに対する魔法効果を高めるPerk。錬金/鍛造装備の効果と、付呪/鍛造薬の効果をも高める 吸血鬼+聖職者に加えて頭に二つの防具をかぶるバグを利用すれば、錬金/鍛冶装備は一部位につき33(41)%、付呪薬は46(57)%、鍛冶薬は184(230)%まで上がる さらにDLC”Dragonborn”導入後「アージダルの才能」及び「黒の書:血色の悪い摂生」の各スキル上昇効果を活用すれば、錬金/鍛冶装備は一部位につき42(52)%、付呪薬は60(75)%、鍛造薬は239(298)%まで上がる 「古の知識」を取得すれば、鍛冶強化を15%アップさせられる CreationClubで追加されたユニーク防具「血虫の兜」を吸血鬼状態(アンデッド状態)で装備すれば聖職者と同じ効力を得られて更に倍率が上がる 参照 鍛冶スキル一覧 能力 要求スキル値 必要能力 説明 鋼鉄の鍛造術 なし なし 鋼鉄の鎧や武器を作成し、2段階の強化ができる 魔法鍛冶 60 鋼鉄の鍛造術 魔法の武器や鎧を強化できる エルフの鍛造術 30 鋼鉄の鍛造術 エルフの鎧や武器を作成し、2段階の強化ができる 高度な鍛造術 50 エルフの鍛造術 スケール、プレートの鎧を作成し、2段階の強化ができる 碧水晶の鍛造術 70 高度な鍛造術 碧水晶の鎧や武器を作成し、2段階の強化ができる ドワーフの鍛造術 30 鋼鉄の鍛造術 ドワーフの鎧や武器を作成し、2段階の強化ができる オークの鍛造術 50 ドワーフの鍛造術 オークの鎧や武器を作成し、2段階の強化ができる 黒檀の鍛造術 80 オークの鍛造術 黒檀の鎧や武器を作成し、2段階の強化ができる デイドラの鍛造術 90 黒檀の鍛造術 デイドラの鎧や武器を作成し、2段階の強化ができる ドラゴンの鍛造術 100 碧水晶の鍛造術orデイドラの鍛造術 ドラゴンの鎧を作成し、2段階の強化ができる 付呪スキル一覧 能力 ランク 要求スキル値 必要能力 説明 付呪師 1 なし なし 付呪の効果が20%強化される 2 20 付呪の効果が40%強化される 3 40 付呪の効果が60%強化される 4 60 付呪の効果が80%強化される 5 80 付呪の効果が100%強化される 炎付呪師 30 付呪師 武器や鎧への炎の付呪が25%強化される 冷気付呪師 40 炎付呪師 武器や鎧への冷気の付呪が25%強化される 雷撃付呪師 50 冷気付呪師 武器や鎧への雷撃の付呪が25%強化される スキル付呪 50 付呪師 鎧へのスキルの付呪が25%強化される 能力付呪 70 スキル付呪 鎧への体力、マジカ、スタミナの付呪が25%強化される 追加付呪 100 雷撃付呪師or能力付呪 同じアイテムに2つ付呪できる 魂凝縮 20 付呪師 魂石で充填する時により多く(250pts)充填される 魂奪取 40 魂凝縮 人間以外の生物にとどめを刺すと、5%の確率で対象の魂を縛り、武器を充填できる 錬金術スキル一覧 能力 ランク 要求スキル値 必要能力 説明 錬金術師 1 なし なし 作成する薬と毒の効果が20%上昇する 2 20 作成する薬と毒の効果が40%上昇する 3 40 作成する薬と毒の効果が60%上昇する 4 60 作成する薬と毒の効果が80%上昇する 5 80 作成する薬と毒の効果が100%上昇する 医薬師 20 錬金術師 作成する体力、マジカ、スタミナを回復させる薬の効果が25%上昇する 毒殺者 30 医薬師 作成する毒の効果が25%上昇する 強力な毒 60 毒殺者 武器に塗った毒の効力が2倍続く 緑の親指 70 強力な毒 植物から材料を2つ採取できる 慈善 30 医薬師 作成する薬の有益な効果が25%上昇する 実験者 1 50 慈善 材料を食べると、最初の効果2つが明らかになる 2 70 材料を食べると、最初の効果3つが明らかになる 3 90 材料を食べると、すべての効果が明らかになる 蛇の血 80 強力な毒or実験者 すべての毒に対して50%の耐性を得る 高純度 100 蛇の血 薬を作成する時は悪い効果が消え、毒を作成する時は良い効果が消える 最強装備の作り方その2 概要 他に、錬金のFortify Restoration(回復上昇)を利用して、装備を強くする方法もあります。装備のステータス上昇効果は、回復の領域の魔法として内部的に設定されているため、「回復上昇」薬で効果を高めることができるのを利用したバグ技です。有用なバグの「超錬金」も参考のこと。 こちらは、 前記のよりも必要スキル条件が緩い 錬金術がスキルレベル100になる前に使えるため、錬金術のレベル上げ目的にも利用可能 コンシューマ版でもこのバグは修正されていないため、ループで無限に強くすることができる(PS4 Skyrim SEのバージョン1.12で確認済) といった特徴がありますが、ゲームバランスを一瞬でほぼ完全に破壊しますので、以前のプレイで一度クリア済のイベントを飛ばしたい、神に等しいキャラをRPするといった用途にのみ用いるようにしましょう。 準備 スキル 付呪スキルを100にして、「スキル付呪」のルート(右側)で「付呪師」(5段階)まで取得する。 錬金術スキルをある程度まで高くする。筆者はスキルレベル100で「錬金術師5/5」「慈善」の状態から始めたが、スキルレベル60で「錬金術師4/5」「慈善」ぐらいでも可能らしい。 アイテム 適当なサークレット、ファルメルの兜、指輪、首飾り、腕装備を数セット(付呪100/錬金術100の最強状態なら2セットで十分)。 バグによりファルメルの兜はサークレットと同時に装備することができる。ただしファルメルの兜の上位版では無理なため、必ず普通のファルメルの兜をストックしておくこと。 極大の魂入り魂石を複数(極大魂石、黒魂石を多数ストックしておくのが望ましいが、アズラの星or黒き星で1回ずつ頑張ってもいい)。 手順 「錬金術上昇」の装備(サークレット、ファルメルの兜、指輪、首飾り、腕装備)を作成する。1周目は各装備25%上昇のはず。 小ループ 出来上がった装備を装着し、「回復上昇」の薬を作成する。作成するのは1つでも良いが、バックアップ用にもう1つ作成しておくと後で実験を途中から再現できるので便利。 「回復上昇」の薬を飲んだ後、その効果がかかっている間に、「錬金術上昇」の装備を一度外し、もう一度付け直す。全部外してから一度に付け直しても、一個一個付け外ししてもどちらでも良い。メニューを開いている間は時間が経過しないため、この付け外しは薬を飲んだ後にメニューを閉じずにそのまま行う方が良い。 この状態で再び「回復上昇」の薬を作成。前回よりも効力が上がっているはず。これを飲み、また「錬金術上昇」の装備を一度外し…の小ループを上昇に限界が出るまで繰り返す。 「回復上昇」の薬の上昇に限界が来たら、「付呪上昇」の薬を複数作成する。30秒しか持たないため、1装備に1個使う気持ちで5個作成するのをお薦め。 この薬を飲んだ状態で、新しい「錬金術上昇」の装備を作成する。筆者の場合(付呪100/錬金術100、強化スキル全取得済)は錬金上昇が各装備119%になった。 再び小ループを繰り返す。最初の「回復上昇」の薬は、前回の最後の小ループで作ったものを使用する方が、効率が良いかもしれない。小ループで上がらなくなったら、再び「錬金術上昇」の装備を作成、の繰り返し。筆者の場合(付呪100/錬金術100、強化スキル全取得済)は、各装備119%の装備5部位さえ作れれば、後は小ループでほぼ無限まで繰り返すことが出来た。 ある程度まで「付呪上昇」薬の効果が上がると、装備一部位で錬金10000%上昇とか100000%上昇とか馬鹿げた値になって歯止めが効かなくなるので、そこで止めて一部位のみで済ます方が良い。 ループを終えたら「付呪上昇」薬と「鍛造上昇」薬を作り、好きな最強装備を作る。
https://w.atwiki.jp/fh-legend/pages/94.html
概要 司祭エレンシアが治める町。 イストリー、ポグロム、ベゴン、フィレント、ムジールと接している。 武器データ 名前 価格 威力 重さ 属性 種類 付加アビリティ ダガー 200G 5 3 無 ナイフ なし ロングソード 2000G 12 7 無 剣 なし ミスリルソード 23000G 30 12 無 剣 なし グレードソード 120000G 52 15 無 剣 なし 聖者の剣 318000G 88 17 光 剣 なし 梓弓 925500G 152 100 光 弓 なし 黒い剣 121000G 82 27 闇 剣 なし 隕鉄の剣 1081000G 128 87 闇 剣 なし ヴァータンの槍 12996000G 114 0 光 槍 なし グングニル 9800000G 167 41 雷 槍 なし 司祭エレンシアの術符 89000000G 52 15 光 術符 なし ミラクル冷凍みかん 208153G 41 30 光 拳 なし 手によくフィットする杖 9578G 17 7 星 杖 なし 司祭エレンシアのイチモツ 48452G 23 -1 光 ナイフ なし 実験作①1/20拳火 9929G 12 -5 火 拳 なし 実験作②20/20拳火 14236G 17 2 火 拳 なし アイアングローブ 3974G 8 -6 無 拳 なし ボルケーノグローブ 21705G 12 -14 火 拳 なし オーロラグローブ 12197G 12 -9 水 拳 なし ソニックグローブ 9624G 8 -9 風 拳 なし グラビティグローブ 16582G 15 -5 星 拳 なし 防具データ 名前 価格 威力 重さ 属性 種類 付加アビリティ 皮の服 1600G 6 3 無 服 なし ウッドアーマー 16000G 15 5 無 鎧 なし ストーンアーマー 45000G 29 10 無 鎧 なし ブロンズアーマー 98000G 45 28 無 鎧 なし ミスリルアーマー 260000G 65 35 無 鎧 なし ゴールドアーマー 1250000G 110 60 無 鎧 なし 月光盾 258500G 61 28 光 盾 なし シャイニングアーマー 8370000G 159 18 光 鎧 なし 聖なる鎧 18200000G 248 40 光 鎧 なし 実験防具 16700G 16 2 無 防具 アクセサリデータ 名前 価格 威力 重さ 属性 種類 付加アビリティ 革の靴 200G 1 0 無 靴 なし ペンダント 3000G 8 5 無 ペンダント なし 剣士の篭手 120000G 22 7 無 拳 なし 貝殻のピアス 350000G 19 6 無 ピアス なし ルビーの指輪 550000G 24 6 無 指輪 なし ダイヤの指輪 750000G 28 7 無 指輪 なし ライトリング 820000G 25 4 光 指輪 なし 極光の腕輪 12500000G 40 -2 光 腕輪 なし 光のブーツ 3600000G 10 -3 光 靴 なし 先制攻撃のアクセサリ 1000G 1 0 無 アクセサリ 先制攻撃 アイテムデータ 名前 価格 威力 重さ 属性 種類 薬草 500G 100 0 無 アイテム オートポーション 10000G 0 0 無 アイテム オートポーション2 50000G 0 0 無 アイテム ラッキーストーン 5000000G 0 0 無 アイテム フェミニア草 1000000G 0 0 無 アイテム 調合薬A 150000G 0 0 無 アイテム 調合薬B 200000G 0 0 無 アイテム 調合薬C 3000000G 0 0 無 アイテム 調合薬D 40000000G 0 0 無 アイテム